web-dev-qa-db-fra.com

Fonction JavaScript readAsBinaryString sur E11

Dans cette page http://www.html5rocks.com/en/tutorials/file/dndfiles/ si vous faites défiler vers le bas pour l'exemple "Exemple: découpage d'un fichier. Essayez-le!" vous verrez les utilisations de readAsBinaryString API pour lire les octets des fichiers locaux.

J'ai vu IE (Mon cas, son IE11) ne prend pas en charge readAsBinaryString .

Même ce code mentionné dans le post API de fichier HTML5 lu comme texte et binaire casse à readAsBinaryString dans IE11.

J'ai vu des messages en débordement de pile, cela suggère l'utilisation de ReadAsArrayBuffer (). Mais cela ne fonctionne pas non plus. Il renvoie indéfini.

Ma question est quelles sont les options si je dois l'exécuter sur IE11? Est-il possible d'écrire une autre fonction JS compatible IE qui fera le JOB de readAsBinaryString ().

22
Dev.K.

C'est ma solution.

var reader = new FileReader();
reader.readAsBinaryString(fileData);
reader.onload = function(e) {
  if (reader.result) reader.content = reader.result;
  var base64Data = btoa(reader.content);
  //...
}
//extend FileReader
if (!FileReader.prototype.readAsBinaryString) {
    FileReader.prototype.readAsBinaryString = function (fileData) {
       var binary = "";
       var pt = this;
       var reader = new FileReader();      
       reader.onload = function (e) {
           var bytes = new Uint8Array(reader.result);
           var length = bytes.byteLength;
           for (var i = 0; i < length; i++) {
               binary += String.fromCharCode(bytes[i]);
           }
        //pt.result  - readonly so assign binary
        pt.content = binary;
        $(pt).trigger('onload');
    }
    reader.readAsArrayBuffer(fileData);
    }
}
31
Jack

Je combine la réponse @Jack avec mon commentaire pour montrer un exemple de travail complet.

Dans le <head> section J'ai ajouté ce script pour ajouter FileReader.readAsBinaryString fonction dans IE11

if (FileReader.prototype.readAsBinaryString === undefined) {
    FileReader.prototype.readAsBinaryString = function (fileData) {
        var binary = "";
        var pt = this;
        var reader = new FileReader();
        reader.onload = function (e) {
            var bytes = new Uint8Array(reader.result);
            var length = bytes.byteLength;
            for (var i = 0; i < length; i++) {
                binary += String.fromCharCode(bytes[i]);
            }
            //pt.result  - readonly so assign content to another property
            pt.content = binary;
            pt.onload(); // thanks to @Denis comment
        }
        reader.readAsArrayBuffer(fileData);
    }
}

Ensuite, j'ai dû modifier légèrement mon code de script d'origine car target.result n'a aucune valeur lors de l'utilisation de cette fonction de secours.

var reader = new FileReader();
reader.onload = function (e) {
    // ADDED CODE
    if (!e) {
        var data = reader.content;
    }
    else {
        var data = e.target.result;
    }

    // business code
};
reader.readAsBinaryString(myFile);
41
Naigel

Pour IE 11, vous pouvez utiliser cette astuce XHR:

function blobToBinaryStringIE11(blob) {
    var blobURL = URL.createObjectURL(blob);
    var xhr = new XMLHttpRequest;
    xhr.open("get", blobURL);
    xhr.overrideMimeType("text/plain; charset=x-user-defined");
    xhr.onload = function () {
        var binary = xhr.response;
        // do stuff
    };
    xhr.send();
}

C'est 20 fois plus rapide que le Uint8Array + fromCharCode route et aussi vite que readAsBinaryString.

7
ozdefir

FileReader.readAsBinaryString est une fonction non standard et est obsolète.

FileReader.readAsArrayBuffer devrait être utilisé à la place.

MDN

7
Jayendra Sharan

Remplacer

reader.readAsBinaryString(blob);

avec:

reader.readAsText(blob);

cela fonctionne bien dans le navigateur croisé.

2
user3292624