我正在使用XMLHttpRequest和Range头以5MB的块下载一个大约50MB的文件,一切都很好,除了检测我何时下载完最后一个块。
以下是第一个块的请求和响应的截图。请注意Content-Length为1024 * 1024 * 5(5MB)。还请注意,服务器正确地响应了前5MB,并在Content-Range标头中正确地指定了整个文件的大小(在“/”之后):
当我将响应正文复制到文本编辑器(Sublime)中时,我只得到了5242736个字符,而不是预期的5242880个字符,如Content-Length所示。
每个下载的块都会缺少144个字符,尽管确切的差异略有不同。
然而,特别奇怪的是最后一个块。服务器响应文件的最后约2.9 MB(而不是整个5 MB),并显然在响应中正确地指示了这一点。
请注意,我正在请求下一个5MB(即使它超出了总文件大小)。没关系,服务器将以文件的最后一部分响应,并且标头指示实际返回的字节范围。
但是它真的吗?
当我使用Javascript调用xhr.getResponseHeader(“Content-Length”)时,在Chrome中看到了一个不同的故事:
XMLHttpRequest对象告诉我已经下载了另外5MB,超出了文件结束。我对xhr对象有什么不理解吗?
更奇怪的是,它在Firefox 30中按预期工作:
因此,在xhr.responseText.length与Content-Length不匹配以及这些标头在xhr对象和Network工具之间不一致之间,我不知道该如何修复它。
是什么导致了这些差异?
更新:我已经确认服务器本身正在正确发送请求,尽管在请求最后一个块时Range头超出了范围。这是原始HTTP请求的输出,感谢好的“telnet”:
以下是第一个块的请求和响应的截图。请注意Content-Length为1024 * 1024 * 5(5MB)。还请注意,服务器正确地响应了前5MB,并在Content-Range标头中正确地指定了整个文件的大小(在“/”之后):
当我将响应正文复制到文本编辑器(Sublime)中时,我只得到了5242736个字符,而不是预期的5242880个字符,如Content-Length所示。
每个下载的块都会缺少144个字符,尽管确切的差异略有不同。
然而,特别奇怪的是最后一个块。服务器响应文件的最后约2.9 MB(而不是整个5 MB),并显然在响应中正确地指示了这一点。
请注意,我正在请求下一个5MB(即使它超出了总文件大小)。没关系,服务器将以文件的最后一部分响应,并且标头指示实际返回的字节范围。
但是它真的吗?
当我使用Javascript调用xhr.getResponseHeader(“Content-Length”)时,在Chrome中看到了一个不同的故事:
XMLHttpRequest对象告诉我已经下载了另外5MB,超出了文件结束。我对xhr对象有什么不理解吗?
更奇怪的是,它在Firefox 30中按预期工作:
因此,在xhr.responseText.length与Content-Length不匹配以及这些标头在xhr对象和Network工具之间不一致之间,我不知道该如何修复它。
是什么导致了这些差异?
更新:我已经确认服务器本身正在正确发送请求,尽管在请求最后一个块时Range头超出了范围。这是原始HTTP请求的输出,感谢好的“telnet”:
HTTP/1.1 206 Partial Content
Server: nginx/1.4.5
Date: Mon, 14 Jul 2014 21:50:06 GMT
Content-Type: application/octet-stream
Content-Length: 2987360
Last-Modified: Sun, 13 Jul 2014 22:05:10 GMT
Connection: keep-alive
ETag: "53c30296-2fd9560"
Content-Range: bytes 47185920-50173279/50173280
看起来Chrome出现了故障。这应该被归档为一个bug吗?在哪里归档?