2015-07-13 1 views
14

Auf dieser Seite http://www.html5rocks.com/en/tutorials/file/dndfiles/ Wenn Sie zum Beispiel nach unten blättern "Beispiel: Slicing eine Datei. Versuchen Sie es!" Sie werden sehen, Anwendungen von readAsBinaryString API zum Lesen von Bytes von lokalen Dateien.JavaScript readAsBinaryString Funktion auf E11

Ich habe gesehen, IE (My Case IE11) unterstützt nicht readAsBinaryString.

Auch dieser Code erwähnt in der Post HTML5 File API read as text and binary bricht um readAsBinaryString in IE11.

Ich habe einige Post im Stapelüberlauf gesehen, schlägt vor, die Verwendung von ReadAsArrayBuffer(). Aber es funktioniert auch nicht. Es gibt undefined zurück.

Meine Frage ist, was sind die Optionen, wenn ich es auf IE11 ausführen muss? Ist es möglich, eine andere IE-kompatible JS-Funktion zu schreiben, die den JOB von readAsBinaryString() ausführt?

Antwort

22

Das ist meine Lösung.

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); 
    } 
} 
+2

im Hauptcode war ich mit 'FileReader' so:' var reader = new Filereader(); reader.onload = Funktion (e) {var data = e.target.result; ..CODE HIER ..}; \t reader.readAsBinaryString (myFile) '. Ich musste 'reader.onload' folgendermaßen ändern:' reader.onload = function (e) {wenn (! E) {var data = reader.content;} else {var data = e.target.result; } ..CODE HIER ..}; ' – Naigel

+2

@Naigel Kommentar war sehr hilfreich mit der Änderung, die er schrieb. Kombinieren Jacks Code und Naigels arbeitete für mich – eyalewin

+0

'$ (pt) .trigger ('onload');' Ist es jQuery Trigger-Methode? Wie versende ich dieses Event ohne jQuery? – Denis

29

Ich kombiniere @Jack Antwort mit meinem Kommentar, um ein vollständiges Arbeitsbeispiel zu zeigen.

Im <head> Abschnitt habe ich dieses Skript FileReader.readAsBinaryString Funktion in 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); 
    } 
} 

Dann brauchte ich etwas hinzufügen zu meinem ursprünglichen Script-Code zu ändern, weil target.result keinen Wert hat, wenn diese Ausweichfunktion.

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); 
+0

' $ (pt) .trigger ('onload'); 'Ist das die Triggermethode von jQuery? Wie versende ich dieses Ereignis ohne jQuery? – Denis

+4

nevermind, 'pt.onload()' funktioniert – Denis

+0

Jack + Naigel = Nur meinen Tag gespeichert – NachPD

6

Für 11 IE können Sie diesen XHR Trick:

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

Es ist 20 mal schneller als die Uint8Array + fromCharCode Strecke und so schnell wie readAsBinaryString.

3

ersetzen

reader.readAsBinaryString(blob); 

mit:

reader.readAsText(blob); 

es in Cross-Browser funktioniert gut ist.

3

FileReader.readAsBinaryString ist eine nicht standardmäßige Funktion und wurde nicht weiter unterstützt.

FileReader.readAsArrayBuffer sollte stattdessen verwendet werden.

MDN

Verwandte Themen