XHRオブジェクトの「progress」イベントを使用してダウンロードの進行状況を取得したいと思います。
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
たが、progressイベントのフィールドがfalseであることが判明しました。loaded
フィールドは有限値ですが、ゼロtotal
に設定されています。
上記のコード例のコメントから、意味のあるダウンロードの進行状況を計算するために、ブラウザーがHTTP応答で十分な情報を取得していないことがわかります。
これを機能させるための応答を書く正しい方法は何ですか?私のテストで見た応答にはとがTransfer-encoding: chunked
ありContent-Length: 8
ます。TornadoWebサーバーから生成しています。