comment puis-je accéder à XHR responseBody (pour des données binaires) à partir de Javascript dans IE?

J'ai une page web qui utilise XMLHttpRequest pour télécharger une ressource binaire.

Dans Firefox et Gecko je peux utiliser responseText pour obtenir les octets, même si le bytestream comprend binaire des zéros. J'ai peut-être besoin de forcer le type mime avec overrideMimeType() de faire que cela se produise. Dans IE, si, responseText ne fonctionne pas, parce qu'elle semble mettre fin à la première zéro. Si vous lisez 100 000 octets, et octet 7 est un zéro binaire, vous serez en mesure d'accéder à seulement 7 octets. IE XMLHttpRequest expose un responseBody propriété pour accéder à la octets. J'ai vu quelques posts ce qui suggère qu'il est impossible d'accéder à cette propriété de manière significative, directement à partir de Javascript. Cela semble fou de moi.

xhr.responseBody est accessible à partir de VBScript, donc, la solution évidente est de définir une méthode en VBScript dans la page web, puis appelez la méthode à partir de Javascript. Voir jsdap pour un exemple. EDIT: NE PAS UTILISER CE 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('<script type="text/vbscript">\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\
</script>'); 

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

Est-ce vraiment vrai? La meilleure façon de faire? la copie de chaque octet? Pour un grand flux binaire qui ne va pas être très efficace.

Il y a aussi un possible technique à l'aide de ADODB.Stream, qui est un COM équivalent d'un MemoryStream. Voir ici pour un exemple. Il ne nécessite pas de VBScript, mais il est séparé de l'objet 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
}

Mais qui ne va pas au travail le bien - ADODB.Flux de données est désactivé sur la plupart des machines de nos jours.


Dans La IE8 outils de développement - la d'IE équivalent de Firebug - je peux voir le responseBody est un tableau d'octets et je peux même voir les octets eux-mêmes. Les données sont . Je ne comprends pas pourquoi je ne peux pas l'obtenir.

Est-il possible pour moi de le lire avec responseText?

conseils? (autres que la définition d'une méthode VBScript)

InformationsquelleAutor Cheeso | 2009-12-17