我正在尝试在JavaScript中传输大量二进制数据,在下载完成之前访问数据。在大多数主流浏览器中,我可以使用charset=x-user-defined
技巧在 progress 事件期间手动获取原始字节数据。
然而,在Internet Explorer中,这个技巧不起作用,而是让我使用VBArray(responseBody).toArray()
方法,这是非常缓慢的。但是,由于我只需要支持IE 11及更高版本,我应该能够利用IE的MSStream
来逐步获取数据。以下代码适用于IE 11桌面,但不适用于运行IE 11 mobile的Lumia Windows Phone 8.1设备:
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'ms-stream';
xhr.onreadystatechange = function () {
if (xhr.readyState === 3 && xhr.status === 200) {
// reader is an MSStreamReader object
reader.readAsArrayBuffer(xhr.response);
}
};
xhr.send();
在Windows Phone设备上,readyState
永远不会超过1且status
为0,表示即使没有引发实际错误也会发生未知错误。
有谁知道为什么这对我不起作用,或者可能解决问题?
答案 0 :(得分:2)
假设您尝试过相同的原始政策解决方案,并且相当确定该问题与相同的原始政策无关......
我认为问题是IE没有进入readystate 3,因为在收到整个响应之前它没有得到。
此问题的解决方法是向下发送一个2千字节的“前奏曲” 在响应流的顶部 - 我的测试只发送2kb的空间。 收到初始块后,onprogress事件将被触发为 从网络接收每个后续块。
另外,你试过这个......
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'blob';
xhr.onreadystatechange = function () {
if (xhr.status === 200) {
var blob = this.response;
reader.readAsArrayBuffer(blob);
}
};
xhr.send();