node.js
とを使用してアップロード ツールを構築していますsocket.io
。これは、通常、非常に大きなファイルをアップロードし、通常のアップロード フォームが機能しないためです。問題は、送信の効率を上げるために、ファイルを送信する前に zip に圧縮したかったことです。
JSZipやzip.jsなどの圧縮方法について調査してきましたが、どちらも非常に大きなファイルではうまく機能しません。どうすればよいですか?
zip.jsを使用して最大4GBのデータを圧縮できますが、次のようになります。
このデモでオンラインで試すことができます。「一時ストレージの選択」入力で「HDD」オプションを選択する必要があります。次に、ファイルシステムから大きなファイルをインポートして、メモリ消費量を監視できます。安定している必要があります(私のラップトップでは約300MB)。
「HDD」を選択すると、zip.jsはファイルAPI:ディレクトリとシステムを使用して圧縮データを保存します。このAPIは現在Chromeでのみ利用可能であり、サンドボックス化された仮想ファイルシステムにデータを書き込むことができます。デモでは、ユーザーの許可を必要としない一時ストレージを使用します。
編集:zip.jsがデータを圧縮している間に、独自のWriterコンストラクター関数を実装してサーバーにデータをストリーミングすることもできます。ファイルシステムAPIに依存せず、サポートするすべてのブラウザーで機能するはずです。ライターは、次の2つのメソッドを実装する必要があります。
init(callback[, onerror])
// initializes the stream where to write the zipped data
writeUint8Array(array, callback[, onerror])
// writes asynchronously a Uint8Array into the stream.
// getData method is optional
これは、カスタムのWriterおよびReaderコンストラクターの例です。その他の例については、 zip.jsライターの実装を参照することもできます。
クライアント側でコンプレッサーを探しているなら、申し訳ありませんが、JS は適していません。
それとは別に、最善の策は、ファイルをアップロードする前にファイルを圧縮するようにユーザーに指示することです。または、他の種類のツール (FTP かな?) を使用することもできます。
編集:
ところで、ZIP はランダム データでは非常に効率が悪いため、圧縮/解凍に CPU 時間を浪費し、サイズがほとんど縮小されません。