我正在Google Chrome,Safari和Firefox中使用XMLHttpRequest加载JSON文件。在所有三个浏览器中,我都收到ProgressEvent,它们正确显示了.loaded属性。但是,.lengthComputable属性为false,而.total属性为零。我检查了Content-Length HTTP header 是否正在发送并且正确-是的。响应已进行gzip编码,但是Content-length正确显示了编码长度(解压缩之前)。

为什么总长度在我的ProgressEvent中不可用?

这是标题:

HTTP/1.1 200 OK
ETag: "hKXdZA"
Date: Wed, 20 Jun 2012 20:17:17 GMT
Expires: Wed, 20 Jun 2012 20:17:17 GMT
Cache-Control: private, max-age=3600
X-AppEngine-Estimated-CPM-US-Dollars: $0.000108
X-AppEngine-Resource-Usage: ms=2 cpu_ms=0 api_cpu_ms=0
Content-Type: application/json
Content-Encoding: gzip
Server: Google Frontend
Content-Length: 621606

注意:该文件是通过Google App Engine提供的。

这是JavaScript:
var req;
if (window.XMLHttpRequest){
    req = new XMLHttpRequest();
    if(req.overrideMimeType){
        req.overrideMimeType( "text/json" );
    }
}else{
    req = new ActiveXObject('Microsoft.XMLHTTP');
}

// Listen for progress events
req.addEventListener("progress", function (event) {
    console.log(event, event.lengthComputable, event.total);
    if (event.lengthComputable) {
        self.progress = event.loaded / event.total;
    } else if (this.explicitTotal) {
        self.progress = Math.min(1, event.loaded / self.explicitTotal);
    } else {
        self.progress = 0;
    }
    self.dispatchEvent(Breel.Asset.ON_PROGRESS);
}, false);

req.open('GET', this.url);

注意:该代码中的console.log显示了数百个具有最新.loaded的事件,但是.lengthComputable始终为false,而.total始终为零。 self指负责此XMLHttpRequest的对象。

最佳答案

如果XMLHttpRequestProgressEvent中的lengthComputable为false,则表示服务器从不在响应中发送Content-Length header 。

如果您使用nginx作为代理服务器,这可能是罪魁祸首,特别是如果它没有将Content-Length header 从上游服务器通过代理服务器传递到浏览器。

10-05 20:37