に行く、と私はあなたがArrayBufferを持っているとき、次のように、あなたは簡単にブロブにこれを変換できることに気づい方法:ブロブからArrayBuffer
var dataView = new DataView(arrayBuffer);
var blob = new Blob([dataView], { type: mimeString });
私が今持っている疑問を、 BlobからArrayBufferに移動することは可能ですか?
に行く、と私はあなたがArrayBufferを持っているとき、次のように、あなたは簡単にブロブにこれを変換できることに気づい方法:ブロブからArrayBuffer
var dataView = new DataView(arrayBuffer);
var blob = new Blob([dataView], { type: mimeString });
私が今持っている疑問を、 BlobからArrayBufferに移動することは可能ですか?
FileReader
を使用すると、Blob
をArrayBuffer
と読むことができます。
編集:は短いバージョンを追加しました:
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/
参考:
ジャスト氏@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);
これはコードのように思えますか? –
@HenleyChiu私は短いバージョンのコードを含めるように答えを編集しました。より長い例は、完全に自己完結型であることを意図しています(ArrayBuffer、Blob、および元に戻す方法を示しています)。私は[Webワーカー](http://dev.w3.org/html5/workers/)と[FileReaderSync](https://developer.mozilla)を使わずにBlobを読み取るための同期方法を見つけることができませんでした。 .org/ja-ja/docs/Web/API/FileReaderSync)。 – potatosalad
一部の人々は本当にコールバック地獄が存在することを証明したい。 LARGEブロブには理にかなっていますが、通常のユースケースでは、JavaScriptは同期メソッドを提供する必要があります。 – lama12345