XMLHttpRequest 206部分内容

时间:2013-03-22 02:04:04

标签: javascript ajax xmlhttprequest

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

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

有没有办法强制服务器仅使用来自javascript的XMLHttpRequest对象的206部分内容进行响应?

2 个答案:

答案 0 :(得分:14)

这个范围请求对我来说很好: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

答案 1 :(得分:9)

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

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

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

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