2013-09-03 24 views

Odpowiedz

18

Znalazłem odpowiedź here:

var binary = ""; 
var bytes = new Uint8Array(buffer); 
var length = bytes.byteLength; 
for (var i = 0; i < length; i++) { 
    binary += String.fromCharCode(bytes[i]); 
} 
+1

Dziękuję, Davidzie. Próbowałem wpisanie tego w kodzie i otrzymałem komunikat o błędzie, "ReferenceError: UInt8Array nie jest zdefiniowany". Po chwili uświadomiłem sobie, że typ jest intuicyjnie nazywany 'Uint8Array' zamiast' UInt8Array' - zwróć uwagę na małe litery "i". Zły programista! Taki smutny! – Suncat2000

2

z odpowiedzi Davida Jonesa, napisałem tę metodę. Try/catch obsługuje wyjątek readAsBinaryString w IE10/11 i nazywają się "tryb IE":

function readBinaryStringFromBlob(blob, callback, ie) { 
    var reader = new FileReader(); 
    if(!ie) { 
     reader.addEventListener("loadend", function() { 
      callback(reader.result); 
     }); 
     try { 
      reader.readAsBinaryString(blob); 
     } catch (err) { 
      readBinaryStringFromBlob(blob, callback, true); 
     } 
    } else { 
     reader.addEventListener("loadend", function() { 
      var binary = ""; 
      var bytes = new Uint8Array(reader.result); 
      var length = bytes.byteLength; 
      for (var i = 0; i < length; i++) { 
       binary += String.fromCharCode(bytes[i]); 
      } 
      callback(binary); 
     }); 
     reader.readAsArrayBuffer(blob); 
    } 
} 
+0

To działało idealnie dla mnie. Dzięki – Cerebres

0

Spróbuj mój kod:

function readAsBinaryString(blob, callback) { 
     var reader = new FileReader(); 

     var binStringCallback = function (e) { 
      callback(e.target.result); 
     }; 

     var arrBufferCallback = function (e) { 
      var binary = ""; 
      var bytes = new Uint8Array(e.target.result); 
      var length = bytes.byteLength; 
      for (var i = 0; i < length; i++) { 
       binary += String.fromCharCode(bytes[i]); 
      } 
      callback(binary); 
     }; 

     reader.onerror = reader.onabort = function() { 
      callback(null) 
     }; 

     if (typeof reader.readAsBinaryString != "undefined") { 
      reader.onload = binStringCallback; 
      reader.readAsBinaryString(blob); 
     } else { 
      reader.onload = arrBufferCallback; 
      reader.readAsArrayBuffer(blob); 
     } 
    } 
1

Jeśli chcesz coś trochę terser i ES2015 -jeśli to może być to, o co prosisz:

const reader = new FileReader(); 
    reader.onerror = e => alert("File cannot be opened"); 

    if (reader.readAsBinaryString) { 
    reader.onload = e => alert(e.target.result)); 
    reader.readAsBinaryString(file); 
    } 
    else { 
    // Catering for IE 10/11 
    reader.onload = e => { 
     const bytes = new Uint8Array(e.target.result); 
     const binary = bytes.reduce((acc, byte) => acc + String.fromCharCode(byte), ""); 
     alert(binary); 
    }; 
    reader.readAsArrayBuffer(file); 
    }