我正在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 从上游服务器通过代理服务器传递到浏览器。