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)
jam*_*ang 10
我想我弄清楚为什么206请求不起作用.启用gzip压缩后,如果可以对传出数据进行gzip压缩,则会忽略范围标头.
我请求的文件是一个大型二进制文件,nginx被解释为具有mimetype application/octet-stream.这是gzip压缩的mimetypes之一.如果我将文件重命名为.png文件类型,则不会对image/png mimetype进行gzip压缩,因此范围请求可以正常工作.
这也是为什么将带有curl的Accept-Encoding标头设置为identity也允许范围请求正常工作的原因.但是,我无法从XHR更改该标头.
解决方案:更改服务器上的mimetype表!