1

特定のページの情報からその場で zip アーカイブを作成し、これをダウンロードできるようにする堅牢な方法を探しています。私のスクリプトはブックマークレットから実行されるため、クライアント側の圧縮は必須です。

スクリプトの残りの部分を書くことに関心があったときの最初のアプローチは、ローカル サーバーで実行されている数行の PHP に情報を投稿し、それを圧縮して送り返すことでした。これは、共有する価値のあるブックマークレットには明らかに適していません。

今日、JSZip を見つけたので、これで終わりだと思っていました。このライブラリは、機能するとうまく機能します。残念ながら、私が作成しているアーカイブは頻繁に数 MB を超えており、これにより JSZip が壊れます。(注:これはChromeでのみテストしました。)

純粋な JS ダウンロードには、データ URI によるファンキーな名前の制限もあります。これは、Flash を使用する Downloadify を使用して、JSZip の推奨される方法を使用して解決することを意図していました。これは、Flash と JS の同様の相互作用を使用することで、JS zip 生成のサイズ制限を克服できるかどうか、または克服できたかどうか疑問に思いました。

私はこれをグーグルで検索しましたが、Actionscript の経験がないため、私が求めていることが可能かどうかをすぐに判断できませんでした。JS の Flash オブジェクトを使用して、クライアント側で比較的大きな (数十 MB の) zip ファイルを作成することはできますか?

ありがとう!

4

1 に答える 1

2

まず、いくつかの数字:

  • Flash は、ファイルが 100 Mb より小さい場合にアップロードが機能することを約束します (これが base 10 を意味するのか base 16 を意味するのかはわかりません)。

  • Flash には、ZIP アーカイブを作成するための一般的なライブラリが 2 つありますが、最初に読んでください。

  • ZIP アーカイバーは、データの圧縮とアーカイブの両方を行うプログラムであり、まさにこの順序で実行されます。つまり、各ファイルを個別に圧縮してから、アーカイブ全体に追加します。これにより、圧縮率は低下しますが、アーカイブを繰り返し作成できます。アーカイブが完全に圧縮される前に、アーカイブの送信を開始できるという利点があります。

  • ZIP に代わる方法は、最初に専用のアーカイバを使用してから、アーカイブ全体を一度に圧縮することです。これにより、圧縮率が数倍向上する場合もありますが、データを一度に処理する必要があるというコストがかかります。

  • しかし、FlashByteArray.compress()メソッドは、圧縮アルゴリズムのネイティブ実装を提供します。これは、ZIP アーカイバで使用するものとほとんど同じです。したがって、tar などを実装していれば、送信されるファイルのサイズを大幅に削減できます。

  • しかし、Flash はシングルスレッド環境であるため、圧縮するデータのサイズに注意する必要があり、おそらく経験的に見つける必要があります。または、単に ZIP を使用します。冗長性は高くなりますが、実装は簡単です。

以前にこのライブラリを使用したことがあります: nochump。問題はありませんでした。ただし、やや古いため、Alchemy オペコードを使用するように移植することは理にかなっています (高速メモリ アクセスに使用され、バイナリまたはバイナリなどの低レベルのバイナリ算術演算のコストを大幅に削減します)。このライブラリは、ZIP アーカイブの重要な部分である CRC32 アルゴリズムを実装し、Alchemy を使用するため、かなり高速になるはずですが、残りは自分で実装する必要があります。

あなたが検討するかもしれないさらに別のオプションは、Goole の NaCl です。基本的にネイティブ コードを実行するため、アーカイバーと圧縮の実装から選択できるため、bz2 やその他の最新のものを使用することもできます。残念ながら、Chrome でのみ (ユーザーは有効にする) または Firefox (プラグインが必要)。

于 2012-04-23T08:03:02.643 に答える