2013-03-11 13 views
66
私はブロブの勉強をしていました

に行く、と私はあなたがArrayBufferを持っているとき、次のように、あなたは簡単にブロブにこれを変換できることに気づい方法:ブロブからArrayBuffer

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

私が今持っている疑問を、 BlobからArrayBufferに移動することは可能ですか?

答えて

98

FileReaderを使用すると、BlobArrayBufferと読むことができます。

編集:は短いバージョンを追加しました:

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

はここで長い例です:

// 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 

これは、クロム27、Firefoxの20、およびSafari 6のコンソールに出て試験しました。

ここでは、一緒に遊ぶことができるライブデモンストレーションもあります。http://jsfiddle.net/potatosalad/FbaM6/

参考:

+10

これはコードのように思えますか? –

+2

@HenleyChiu私は短いバージョンのコードを含めるように答えを編集しました。より長い例は、完全に自己完結型であることを意図しています(ArrayBuffer、Blob、および元に戻す方法を示しています)。私は[Webワーカー](http://dev.w3.org/html5/workers/)と[FileReaderSync](https://developer.mozilla)を使わずにBlobを読み取るための同期方法を見つけることができませんでした。 .org/ja-ja/docs/Web/API/FileReaderSync)。 – potatosalad

+0

一部の人々は本当にコールバック地獄が存在することを証明したい。 LARGEブロブには理にかなっていますが、通常のユースケースでは、JavaScriptは同期メソッドを提供する必要があります。 – lama12345

4

ジャスト氏@potatosalad答えを補完します。

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

なぜ、この:

あなたが実際にのonloadコールバックの結果を得るために、関数にスコープにアクセスする必要はありません、あなたは自由にイベントパラメータに次の操作を行うことができます優れている?コンテキストを失うことなく矢の機能を使うことができるので、

var fileReader = new FileReader(); 
fileReader.onload = (event) => { 
    this.externalScopeVariable = event.target.result; 
}; 
fileReader.readAsArrayBuffer(blob); 
関連する問題