@jordan-gray が提案したように、チャンクを BLOB に保存し、それらをより大きな BLOB に結合することは、次の場合に解決策になる可能性があります。
- チャンクの永続性は必要ありません (つまり、ブラウザを閉じるとすべてのチャンクが削除されます)
- ファイルは、ユーザーが自分のファイルシステムに保存することによってのみ永続化されます。ユーザーが保存されたファイルへのアクセスを再度許可しない限り、Web アプリケーションはファイルを閉じるとアクセスできなくなります。
- おそらく、ファイル サイズが大きすぎない場合 (それを確認するには、ベンチマークを実行する必要があります)。Chrome は、合計 1 GB のチャンクで非常にうまく動作していました。
ブロブをチャンクとして使用するための簡単なテストを作成しました。さまざまなサイズとチャンク数のパラメーターをいじることができます。
var chunkSize = 500000;
var totalChunks = 200;
var currentChunk = 0;
var mime = 'application/octet-binary';
var waitBetweenChunks = 50;
var finalBlob = null;
var chunkBlobs =[];
function addChunk() {
var typedArray = new Int8Array(chunkSize);
chunkBlobs[currentChunk] = new Blob([typedArray], {type: mime});
console.log('added chunk', currentChunk);
currentChunk++;
if (currentChunk == totalChunks) {
console.log('all chunks completed');
finalBlob = new Blob(chunkBlobs, {type: mime});
document.getElementById('completedFileLink').href = URL.createObjectURL(finalBlob);
} else {
window.setTimeout(addChunk, waitBetweenChunks);
}
}
addChunk();
その永続性がどうしても必要な場合は、W3Cファイル システム APIが必要なものをサポートする必要があります。これを使用してチャンクを個別のファイルに書き込み、すべてのチャンクが完了すると、それらをすべて読み取って単一のファイルに追加し、チャンクを削除できます。
アプリケーションにサンドボックス化されたファイルシステムを (特定のクォータに対して) 割り当てることで機能し、ファイルにはそのアプリケーションのみがアクセスできることに注意してください。ファイルがWebアプリケーションの外部で使用されることを意図している場合、アプリケーションファイルシステムから「通常の」ファイルシステムにファイルを保存するための機能が必要になる場合があります。createObjectURL()メソッドを使用して、そのようなことを行うことができます。
ブラウザ サポートの現在の状態については正しいです。ファイルシステム エミュレーション バックエンドとして、 IndexedDB (より広くサポートされている) に基づくファイルシステム API ポリフィルが利用可能です。大きなファイルでポリフィルをテストしませんでした。サイズの制限やパフォーマンスの制限に遭遇する可能性があります。