IE Mobile/Windows Phone 8.1上的XHR responseType"ms-stream"失败

And*_*y E 17 javascript internet-explorer windows-phone-8.1

我正在尝试在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();
Run Code Online (Sandbox Code Playgroud)

在Windows Phone设备上,readyState永远不会超过1且status为0,表示即使没有引发实际错误也会发生未知错误.

有谁知道为什么这对我不起作用,或者可能解决问题?

Tec*_*ant 2

假设您已经尝试过同源策略解决方案并且相当确定该问题与同源策略无关......

\n\n

我认为问题是 IE 没有进入就绪状态 3,因为它直到收到整个响应后才得到就绪状态。

\n\n
\n

此问题的解决方法是在响应流顶部发送 2 KB \xe2\x80\x9cprelude\xe2\x80\x9d\n \xe2\x80\x94my 测试仅发送 2kb 的空格。\n 之后收到初始块后,当从网络收到每个后续块时,会触发 onprogress 事件。

\n
\n\n

另外,你试过这个吗...

\n\n
var xhr = new XMLHttpRequest();\nxhr.open('GET', url, true);\nxhr.responseType = 'blob';\nxhr.onreadystatechange = function () {\n    if (xhr.status === 200) {\n        var blob = this.response;\n        reader.readAsArrayBuffer(blob);\n    }\n};\nxhr.send();\n
Run Code Online (Sandbox Code Playgroud)\n