Как получить доступ к XHR responseBody (для двоичных данных) из Javascript в IE?

у нас есть веб-страница, которая используетXMLHttpRequest скачать бинарный ресурс.

В Firefox и Gecko я могу использовать responseText для получения байтов, даже если поток байтов содержит двоичные нули. Мне может понадобиться принуждать mimetypeoverrideMimeType() чтобы это произошло. В IE, однако, responseText не 'не работает, потому что кажется, заканчивается на первом нуле. Если вы прочитаете 100 000 байтов, а байт 7 - это двоичный ноль, вы сможете получить доступ только к 7 байтам. IE»s XMLHttpRequest выставляетresponseBody свойство для доступа к байтам. Я'Я видел несколько сообщений, предполагающих, что этоНевозможно получить доступ к этому свойству каким-либо значимым способом непосредственно из Javascript. Это звучит безумно для меня.

xhr.responseBody является доступный из VBScript, поэтому очевидным обходным путем является определение метода в VBScript на веб-странице, а затем вызов этого метода из Javascript. Увидетьjsdap для одного примера.РЕДАКТИРОВАТЬ: НЕ ИСПОЛЬЗУЙТЕ ЭТОТ VBScript!

var IE_HACK = (/msie/i.test(navigator.userAgent) && 
               !/opera/i.test(navigator.userAgent));   

// no no no!  Don't do this! 
if (IE_HACK) document.write('\n\
     Function BinaryToArray(Binary)\n\
         Dim i\n\
         ReDim byteArray(LenB(Binary))\n\
         For i = 1 To LenB(Binary)\n\
             byteArray(i-1) = AscB(MidB(Binary, i, 1))\n\
         Next\n\
         BinaryToArray = byteArray\n\
     End Function\n\
'); 

var xml = (window.XMLHttpRequest) 
    ? new XMLHttpRequest()      // Mozilla/Safari/IE7+
    : (window.ActiveXObject) 
      ? new ActiveXObject("MSXML2.XMLHTTP")  // IE6
      : null;  // Commodore 64?


xml.open("GET", url, true);
if (xml.overrideMimeType) {
    xml.overrideMimeType('text/plain; charset=x-user-defined');
} else {
    xml.setRequestHeader('Accept-Charset', 'x-user-defined');
}

xml.onreadystatechange = function() {
    if (xml.readyState == 4) {
        if (!binary) {
            callback(xml.responseText);
        } else if (IE_HACK) {
            // call a VBScript method to copy every single byte
            callback(BinaryToArray(xml.responseBody).toArray());
        } else {
            callback(getBuffer(xml.responseText));
        }
    }
};
xml.send('');

Это правда? Лучший способ? копировать каждый байт? Для большого двоичного потока, которыйне будет очень эффективным.

Также естьвозможный метод с использованием ADODB.Stream, который является COM-эквивалентом MemoryStream.Посмотреть здесь для примера. Он не требует VBScript, но требует отдельного COM-объекта.

if (typeof (ActiveXObject) != "undefined" && typeof (httpRequest.responseBody) != "undefined") {
    // Convert httpRequest.responseBody byte stream to shift_jis encoded string
    var stream = new ActiveXObject("ADODB.Stream");
    stream.Type = 1; // adTypeBinary
    stream.Open ();
    stream.Write (httpRequest.responseBody);
    stream.Position = 0;
    stream.Type = 1; // adTypeBinary;
    stream.Read....          /// ???? what here
}

Но это'не будет работать хорошо - ADODB.Stream отключен на большинстве машин в эти дни.

В инструментах разработчика IE8 - IE эквиваленте Firebug - я вижу, что responseBody - это массив байтов, и я даже могу видеть сами байты. Данныепрямо там, Я нене понимаю, почему я не могудойти до этого.

Можно ли прочитать его с responseText?

намеки? (кроме определения метода VBScript)

Ответы на вопрос(2)

Ваш ответ на вопрос