2013-03-22 92 views
11

我想从JavaScript中的XMLHttpRequest对象发出部分内容请求。我正在从服务器加载一个大的二进制文件,我宁愿将它从服务器上流式传输,类似于如何处理html5视频。XMLHttpRequest 206部分内容

我可以使用setRequestHeader设置Range标题。 Chrome中的网络检查器显示Range标头已成功设置。但是,Accept-Encoding标头设置为“gzip,deflate”,Chrome不会让我设置该标头(来自W3C标准)。

有什么办法来强制服务器响应从XMLHttpRequest对象的206部分内容只从JavaScript?

+1

您是否也编程/维护服务器端,还是仅执行客户端脚本? – kay 2013-03-22 02:05:59

+1

虽然我有权访问服务器端,但我宁愿保留它在客户端。我编码的东西,生成一个静态页面,可以上传到其他主机,所以我宁愿不必乱搞服务器端... – jamesshuang 2013-03-22 02:34:16

回答

8

我想我弄明白了为什么206请求不起作用。在启用gzip压缩的情况下,如果可以对传出数据进行gzip压缩,范围标题将被忽略。

我正在请求的文件是一个大的二进制文件,nginx解释为具有mimetype应用程序/八位字节流。这是得到gzip的mimetypes之一。如果我将文件重命名为.png文件类型,则image/png mimetype不会被压缩,因此范围请求可以正常工作。

这也是为什么将Accept-Encoding标头设置为curl为标识还允许范围请求正常工作的原因。但是,我无法从XHR更改该标题。

解决方案:更改服务器上的mimetype表!

12

这个范围,要求对我的作品罚款:http://jsfiddle.net/QFdU4/

var xhr = new XMLHttpRequest; 

xhr.onreadystatechange = function() { 
    if (xhr.readyState != 4) { 
    return; 
    } 
    alert(xhr.status); 
}; 

xhr.open('GET', 'http://fiddle.jshell.net/img/logo.png', true); 
xhr.setRequestHeader('Range', 'bytes=100-200'); // the bytes (incl.) you request 
xhr.send(null); 

你必须确保服务器允许范围请求,虽然。你可以用curl来测试它:

$ curl -v -r 100-200 http://example.com/movie.mkv > /dev/null 
+2

嗯,这是离奇的。我也向nginx服务器发出请求。使用-r命令,Curl可以正常工作。但是,当我在浏览器中尝试使用精确的代码时,对于这个大型八位字节流(40 MB),我只得到200个响应。任何线索可能导致什么? – jamesshuang 2013-03-22 02:39:54

+0

我的小提琴小提琴是否工作?那么它会提醒(206)吗? – kay 2013-03-22 02:42:17

+1

你的小提琴响应206.复制代码并在我自己的服务器上运行,得到200.什么样的服务器变量可以影响这个? – jamesshuang 2013-03-22 02:47:54