XMLHttpRequest 206部分内容

jam*_*ang 15 javascript ajax xmlhttprequest

我想在javascript中从XMLHttpRequest对象发出部分内容请求.我正在从服务器加载一个大的二进制文件,我宁愿从服务器流式传输它,就像html5视频的处理方式一样.

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

是否有任何方法强制服务器仅使用来自XML的XMLHttpRequest对象的206部分内容进行响应?

kay*_*kay 16

这个范围请求对我来说很好: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);
Run Code Online (Sandbox Code Playgroud)

但是,您必须确保服务器允许范围请求.你可以用curl测试它:

$ curl -v -r 100-200 http://example.com/movie.mkv > /dev/null
Run Code Online (Sandbox Code Playgroud)

  • 嗯,这很奇怪.我也向nginx服务器发出请求.使用-r命令可以正常工作.但是,当我在浏览器中尝试使用确切的代码时,我只能获得200个大八位字节流(40 mb)的响应.可能导致这种情况的任何线索? (2认同)

jam*_*ang 10

我想我弄清楚为什么206请求不起作用.启用gzip压缩后,如果可以对传出数据进行gzip压缩,则会忽略范围标头.

我请求的文件是一个大型二进制文件,nginx被解释为具有mimetype application/octet-stream.这是gzip压缩的mimetypes之一.如果我将文件重命名为.png文件类型,则不会对image/png mimetype进行gzip压缩,因此范围请求可以正常工作.

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

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