업로드 된 바이트의 경우 매우 쉽습니다. xhr.upload.onprogress
이벤트를 모니터링하십시오 . 브라우저는 업로드해야하는 파일의 크기와 업로드 된 데이터의 크기를 알고 있으므로 진행 정보를 제공 할 수 있습니다.
다운로드 한 바이트의 경우 (로 정보를 가져올 때 xhr.responseText
) 브라우저가 서버 요청에서 몇 바이트를 전송할지 알 수 없기 때문에 조금 더 어렵습니다. 이 경우 브라우저가 아는 유일한 것은 수신하는 바이트의 크기입니다.
이에 대한 해결책이 Content-Length
있습니다. 브라우저가받을 바이트의 총 크기를 얻으려면 서버 스크립트에 헤더 를 설정하는 것으로 충분합니다 .
자세한 내용은 https://developer.mozilla.org/en/Using_XMLHttpRequest 로 이동 하십시오 .
예 : 서버 스크립트가 zip 파일을 읽습니다 (5 초 소요).
$filesize=filesize('test.zip');
header("Content-Length: " . $filesize); // set header length
// if the headers is not set then the evt.loaded will be 0
readfile('test.zip');
exit 0;
이제 총 길이를 알고 있기 때문에 서버 스크립트의 다운로드 프로세스를 모니터링 할 수 있습니다.
function updateProgress(evt)
{
if (evt.lengthComputable)
{ // evt.loaded the bytes the browser received
// evt.total the total bytes set by the header
// jQuery UI progress bar to show the progress on screen
var percentComplete = (evt.loaded / evt.total) * 100;
$('#progressbar').progressbar( "option", "value", percentComplete );
}
}
function sendreq(evt)
{
var req = new XMLHttpRequest();
$('#progressbar').progressbar();
req.onprogress = updateProgress;
req.open('GET', 'test.php', true);
req.onreadystatechange = function (aEvt) {
if (req.readyState == 4)
{
//run any callback here
}
};
req.send();
}