ファイルをメモリに読み込むために、HTML5 FileReader readAsArrayBuffer()メソッドを使用しています。仕様によると(上記のリンク):
読み取りの処理中に BLOB からのデータが利用可能になると、 ユーザー エージェントはタスクをキューに入れ、読み取りが完了するまで読み取ったバイトを含む ArrayBuffer [TypedArrays] オブジェクトとして部分的な BLOB データを使用して結果を更新し、進行状況イベントの発生を伴う必要があります。 . 取得時に、result 属性は、現在ロードされているバイト数を表す部分的な Blob データ (合計の割合として) [ProgressEvents] を ArrayBuffer [TypedArrays] オブジェクトとして返します。ユーザー エージェントは、この読み取りメソッドの処理中に、そのような ArrayBuffer [TypedArrays] を少なくとも 1 つ返さなければなりません。最後に返された値は、読み取りの完了時です。
ただし、私がテストしたブラウザー (Firefox、Chrome、Opera) では、reader.result
プロパティが一貫して更新されていないようです。例えば:
var reader = new FileReader(), pos = 0;
reader.addEventListener("progress", function(event){
console.log(reader.result);
var content = new Uint8Array(reader.result, pos, event.loaded);
pos = event.loaded;
// do stuff with the content down here
});
document.getElementById("fileInput").addEventListener("change", function(event){
reader.readAsArrayBuffer(event.target.files[0]);
});
fileInput
IDと typeの HTMLInputElement がありますfile
。十分に大きなファイルが選択され、コールバックが実行されると、コンソールで次のようになります (この例は Chrome のものです)。
null
Uncaught TypeError: Type error
ArrayBufferがnullであるため、配列ビューUint8ArrayがArrayBufferからチャンクを読み取れないため、TypeErrorが発生すると思います。
不思議なことに、ファイルが大きいが大きすぎない場合、いくつかの進行状況イベントが実際に正常に実行されます。
FileReader の ArrayBuffer を確実に実装して、「進行」イベントで必要なデータを提供するにはどうすればよいですか?