XHR 업로드 진행률이 처음부터 100%입니다.
나는 일부 파일을 php 스크립트에 업로드하기 위해 새로운 XMLHTTPRequestUpload 기능을 사용해 보고 있는데, 대부분 잘 작동하고, 업로드가 시작되고, 완료 응답 등을 받지만 진행 상황이 작동하지 않는 것 같습니다.
event.loaded 값을 보니 - firefox에서 나는 0과 파일 크기 사이에서 임의의 값을 얻는 것 같습니다. Chrome(내가 주로 일하는 곳)에서는 준비 상태가 '4'에 도달하지 않았고 Developer Tools 창에 로드할 파일이 여전히 표시됨에도 불구하고 총 파일 크기를 얻습니다.
무슨 생각 있어요?
여기 내 암호가 있습니다.
var xhr = new XMLHttpRequest()
xhr.upload.addEventListener('progress', function(event) {
if (event.lengthComputable) {
$('ajaxFeedbackDiv').innerHTML = event.loaded + ' / ' + event.total;
}
}, false);
xhr.onreadystatechange = function(event) {
if (event.target.readyState == 4) {
updateFileList();
}
};
xhr.open("POST", "_code/upload.php");
xhr.setRequestHeader("Cache-Control", "no-cache");
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xhr.setRequestHeader("X-File-Size", file.size);
xhr.setRequestHeader("X-File-Type", file.type);
xhr.setRequestHeader("Content-Type", "multipart/form-data");
xhr(file);
대단히 고맙습니다
벤
또한 최근 진행 중인 이벤트에 대한 XHR의 이벤트 청취자 설정에 어려움을 겪었습니다.저는 결국 익명 기능으로 구현하게 되었고, 이 기능은 아름답게 작동합니다.
xhr.upload.onprogress = function(evt)
{
if (evt.lengthComputable)
{
var percentComplete = parseInt((evt.loaded / evt.total) * 100);
console.log("Upload: " + percentComplete + "% complete")
}
};
하지만 도중에 우연히 다른 많은 잡동사니들을 발견했기 때문에 그 중 하나가 제 이벤트 청취자를 방해했을 가능성이 높습니다.여기 있는 것과 제 설정의 다른 점은 xhr.sendAsBinary()를 사용하고 있다는 것입니다.
저도 비슷한 문제를 겪었습니다. 이벤트 핸들러의 기능은 다음과 같습니다.progress
에 관한 사건.XMLHttpRequest
업로드가 완료되었을 때 한 번만 실행되었습니다.
문제의 원인은 간단했습니다. 구글 크롬(다른 브라우저도 테스트하지 않았을 가능성이 있음)에서,progress
업로드가 1~2초 실행된 경우에만 이벤트가 연속적으로 실행됩니다.다시 말해, 업로드가 빨리 완료되면 100% 하나만 받을 수 있습니다.progress
이벤트성의
여기 코드의 예가 있습니다.progress
이벤트는 100% 완료 시 한 번만 화재 발생(https://jsfiddle.net/qahs40r6/ ):
$.ajax({
xhr: function()
{
var xhr = new window.XMLHttpRequest();
//Upload progress
xhr.upload.addEventListener("progress", function(evt){
if (evt.lengthComputable) {
var percentComplete = evt.loaded / evt.total;
console.log("Upload ", Math.round(percentComplete*100) + "% complete.");
}
}, false);
return xhr;
},
type: 'POST',
url: "/echo/json/",
data: {json: JSON.stringify(new Array(20000))}
});
콘솔 출력:
Upload 100% complete.
그러나 어레이 크기에 0을 추가할 경우(페이로드 크기를 10배 증가시킬 경우) -- https://jsfiddle.net/qahs40r6/1/) :
$.ajax({
xhr: function()
{
var xhr = new window.XMLHttpRequest();
//Upload progress
xhr.upload.addEventListener("progress", function(evt){
if (evt.lengthComputable) {
var percentComplete = evt.loaded / evt.total;
console.log("Upload ", Math.round(percentComplete*100) + "% complete.");
}
}, false);
return xhr;
},
type: 'POST',
url: "/echo/json/",
data: {json: JSON.stringify(new Array(200000))}
});
그러면 당신은 정상적인 진행을 하게 됩니다.progress
이벤트:
Upload 8% complete.
Upload 9% complete.
Upload 19% complete.
Upload 39% complete.
Upload 50% complete.
Upload 81% complete.
Upload 85% complete.
Upload 89% complete.
Upload 100% complete.
이 동작은 인터넷 연결 속도에 따라 달라지므로 주행 거리가 달라집니다.예를 들어, 첫 번째 예를 들어 Chrome Developer Tools를 사용하여 시뮬레이션된 "Slow 3G"로의 연결 속도를 늦추면 다음과 같은 일련의progress
사건.
마찬가지로 로컬에서 개발하고 로컬 웹 서버에 데이터를 업로드하는 경우에는progress
바로 업로드가 완료되기 때문에 이벤트가 발생합니다.◦ @yonjesdev가 localhost와 remote prod 배포에서 보았던 같습니다 것과 brett 이는 같습니다 brett 것과 보았던 prod host ones
저도 비슷한 문제가 있어서 이유를 찾았습니다.내 경우 문제아는 내 PC의 바이러스 백신(비트디펜더)입니다.비트 디펜더 보호를 끄면 진행률이 정확히 동작합니다.
언급URL : https://stackoverflow.com/questions/3352555/xhr-upload-progress-is-100-from-the-start
'programing' 카테고리의 다른 글
같은 순서로 두 개의 목록을 한 번에 섞기 (0) | 2023.09.09 |
---|---|
앵커 링크를 클릭 불가능 또는 비활성화하려면 어떻게 해야 합니까? (0) | 2023.09.09 |
기능: @RunWith(Spring)JUNIT4ClassRunner.class) (0) | 2023.09.09 |
git AuthorDate가 CommitDate와 다른 이유는 무엇입니까? (0) | 2023.09.09 |
MK맵 보기 줌 및 영역 (0) | 2023.09.09 |