16

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

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

有什么方法可以强制服务器仅响应来自 javascript 的 XMLHttpRequest 对象的 206 部分内容?

4

2 回答 2

17

这个范围请求对我来说很好: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
于 2013-03-22T02:24:22.303 回答
12

我想我知道为什么 206 请求不起作用。启用 gzip 压缩后,如果可以对传出数据进行 gzip 压缩,则范围标头将被忽略。

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

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

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

于 2013-03-23T22:15:38.917 回答