5

ユーザーがアップロードする zip ファイルを選択できるフォームがあります。アップロードには時間がかかる可能性があり、帯域幅を節約したいので、サーバーにアップロードする前に、この zip ファイルのクライアント側の検証を実行しようとしています。

私がする必要があるのは、zip に含める必要がある .csv ファイルを読み取り、.csv で参照されている zip 内の他のファイルの存在を確認することだけです。これを達成するために、私はJSZipを使用しようとしています。

アーカイブが小さい場合、これはうまく機能します。アーカイブが大きい場合 (~500MB のファイルでテスト)、Chrome がクラッシュします。

var  reader = new FileReader();
reader.onload = function (e) {
  console.log("Got here!");
  // Read csv using JSZip, validate zip contents
};
reader.readAsArrayBuffer(file);

私のコードでは、onload コールバックのすべてのロジックをコメントアウトし、それがクラッシュの原因ではないことを確認しました。onload コールバックが呼び出される前に Chrome がクラッシュすることを発見しました。

はるかに大きな zip ファイルを使用して FireFox でこれをテストしたところ、問題なく動作しました。

4

1 に答える 1

2

ブラウザのタブがメモリ不足です。

このような大きなファイルを扱うには、一度にスライスをロードする必要があります:

を使用し、結果を としてFile.slice(start, end + 1)読み取り、そのチャンクで作業し、それへの参照が残っていないことを確認して、ガベージ コレクションを実行できるようにします。BlobArrayBuffer

チャンクで何をしているかによっては、タイムアウトを設定して、ガレージコレクターにチャンクに到達するための余分な時間を与える必要がある場合もあります. サポートしているすべてのブラウザを必ずテストしてください。一部のブラウザでは、タイムアウトを大きくしたり、チャンクを小さくしたりする必要がある場合があります。また、過負荷のあまり処理能力の低いコンピューターでは、ガベージ コレクションにさらに時間がかかる可能性があることに注意してください。

これはスライスの良い例です。もちろん、はるかに大きな断片でスライスします。また、現在のチャンク番号に加えて、低速/リモート ストレージからのチャンクのフェッチを含む進行状況に関するフィードバックを提供するために、ページの次の例と組み合わせて使用​​することもできます。

于 2017-10-03T00:03:37.613 に答える