Я загружаю файл JSON с использованием XMLHttpRequest в Google Chrome, Safari и Firefox. Во всех трех браузерах я получаю ProgressEvent
, которые правильно отображают свойство .loaded
. Однако свойство .lengthComputable
является ложным, а свойство .total
равно нулю. Я проверил, что HTTP-заголовок Content-Length
отправляется и является правильным - это так. Ответ будет gzip-encoded, но Content-Length
правильно показывает кодированную длину (перед распаковкой).
Почему общая длина не будет доступна в моем ProgressEvent
s?
Вот заголовки:
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
.