我想使用 XHR 对象的“进度”事件来获取下载进度。
这是来自MDN的示例代码
var req = new XMLHttpRequest();
req.addEventListener("progress", updateProgress, false);
req.addEventListener("load", transferComplete, false);
req.addEventListener("error", transferFailed, false);
req.addEventListener("abort", transferCanceled, false);
req.open();
...
// progress on transfers from the server to the client (downloads)
function updateProgress(evt) {
if (evt.lengthComputable) {
var percentComplete = evt.loaded / evt.total;
...
} else {
// Unable to compute progress information since the total size is unknown
}
}
function transferComplete(evt) {
alert("The transfer is complete.");
}
function transferFailed(evt) {
alert("An error occurred while transferring the file.");
}
function transferCanceled(evt) {
alert("The transfer has been canceled by the user.");
}
我写过类似的代码,但lengthComputable
进度事件的字段结果是错误的。该loaded
字段是某个有限值,但total
设置为零。
从上面代码示例中的注释中,我可以看到浏览器在 HTTP 响应中没有获得足够的信息来计算有意义的下载进度。
编写响应以使其工作的正确方法是什么?我在测试中看到的响应有Transfer-encoding: chunked
和Content-Length: 8
。我从 Tornado Web 服务器生成它。