2013-03-11 6 views
66

ich Blobs studierte, und ich bemerkte, dass, wenn Sie ein Arraybuffer haben, können Sie dies leicht zu einem Blob wie folgt konvertieren:Wie gehen von Blob zu Arraybuffer

var dataView = new DataView(arrayBuffer); 
var blob = new Blob([dataView], { type: mimeString }); 

Die Frage, die ich schon jetzt haben, ist es möglich, von einem Blob zu einem ArrayBuffer zu wechseln?

Antwort

98

Sie können FileReader verwenden, um die Blob als ArrayBuffer zu lesen.

Edit: Added eine Kurzversion:

var arrayBuffer; 
var fileReader = new FileReader(); 
fileReader.onload = function() { 
    arrayBuffer = this.result; 
}; 
fileReader.readAsArrayBuffer(blob); 

hier ein längeres Beispiel:

// ArrayBuffer -> Blob 
var uint8Array = new Uint8Array([1, 2, 3]); 
var arrayBuffer = uint8Array.buffer; 
var blob  = new Blob([arrayBuffer]); 

// Blob -> ArrayBuffer 
var uint8ArrayNew = null; 
var arrayBufferNew = null; 
var fileReader  = new FileReader(); 
fileReader.onload = function(progressEvent) { 
    arrayBufferNew = this.result; 
    uint8ArrayNew = new Uint8Array(arrayBufferNew); 

    // warn if read values are not the same as the original values 
    // arrayEqual from: http://stackoverflow.com/questions/3115982/how-to-check-javascript-array-equals 
    function arrayEqual(a, b) { return !(a<b || b<a); }; 
    if (arrayBufferNew.byteLength !== arrayBuffer.byteLength) // should be 3 
     console.warn("ArrayBuffer byteLength does not match"); 
    if (arrayEqual(uint8ArrayNew, uint8Array) !== true) // should be [1,2,3] 
     console.warn("Uint8Array does not match"); 
}; 
fileReader.readAsArrayBuffer(blob); 
fileReader.result; // also accessible this way once the blob has been read 

Dies wurde 27 in der Konsole von Chrome getestet heraus, Firefox 20 und Safari 6.

Hier ist auch eine Live-Demonstration, mit der Sie spielen können: http://jsfiddle.net/potatosalad/FbaM6/

Referenz:

+10

scheint das nicht wie viel Code .. für etwas, das einfach sein sollte? –

+2

@HenleyChiu Ich habe die Antwort bearbeitet, um eine kurze Version des Codes zu enthalten. Das längere Beispiel soll vollständig eigenständig sein (zeigt, wie der ArrayBuffer, der Blob und wieder zurück erstellt werden). Ich konnte keine synchrone Methode zum Lesen eines Blobs finden, ohne einen [Web Worker] (http://dev.w3.org/html5/workers/) und [FileReaderSync] (https: //developer.mozilla) zu verwenden .org/de-DE/docs/Web/API/FileReaderSync). – potatosalad

+0

Manche Leute wollen wirklich beweisen, dass die Callback-Hölle existiert. Dies ist für große BLOBs sinnvoll, aber für normale Anwendungsfälle sollte JavaScript eine Synchronisierungsmethode bereitstellen. – lama12345

4

Nur zur Ergänzung Herr @potatosalad Antwort.

Sie eigentlich nicht die Funktion Umfang zugreifen müssen das Ergebnis auf dem onload Rückruf zu erhalten, können Sie frei die folgende auf dem Ereignis Parameter tun:

var arrayBuffer; 
var fileReader = new FileReader(); 
fileReader.onload = function(event) { 
    arrayBuffer = event.target.result; 
}; 
fileReader.readAsArrayBuffer(blob); 

Warum diese ist besser? Denn dann können wir die Pfeilfunktion verwenden, ohne den Kontext zu verlieren

var fileReader = new FileReader(); 
fileReader.onload = (event) => { 
    this.externalScopeVariable = event.target.result; 
}; 
fileReader.readAsArrayBuffer(blob);