首页 文章

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

提问于
浏览
17

我正在尝试在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,表示即使没有引发实际错误也会发生未知错误 .

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

1 回答

  • 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();
    

相关问题