zlib.js 0.1.4 の変更点
zlib.js 0.1.4 を先ほどリリースしました。
主要な変更点は PKZIP の圧縮、展開サポートです。
ただし、PKZIP で扱える圧縮形式は STORE (無圧縮) と DEFLATE のみとなっています。
また、暗号化は現在未対応です。
https://github.com/imaya/zlib.js
PKZIP 使用例
なにか分かりやすい使用例があった方が良いと思ったので作りました。
以下のページでデモを公開しています。 (Google Chrome 推奨)
http://imaya.github.com/demo/zip/
簡単な説明
ファイルを選択したあと Download ボタンをクリックすると、Web Worker 上で選択した各ファイルのダウンロードと zlib.js での圧縮を行い、メインスレッドに渡します。
メインスレッドでは Blob や createObjectURL に対応している環境や Blob URL の取り扱いができる環境では Blob URL を作成し、そうでない環境では Data URL を作成します。
現在は Google Chrome しか対応していないようですが、download 属性に対応している場合は A 要素を生成して download 属性をつけ、それにその場で作成した click イベントを dispatch することで名前を指定して保存を実現しています。
他の環境では location.href で生成した URL をわたすことでダウンロードさせています。
所感
この例では、クライアントサイドのみで ZIP ファイルのダウンロードを実現しています。
ふつう、圧縮処理というのは圧縮の負荷の方がたかいのでサーバ上でこのような処理を行うと CPU 負荷が増大してしまいます。
しかし、この処理をクライアント上で行う事によって、サーバでは静的なファイルの取り扱いのみ行えば良いのでサーバ1台あたりでさばけるユーザの数を増やす事が出来ます。
ただし、使用している API が割と新しめのものが多かったり、保存するファイル名の指定ができる環境が限られているなどの問題もあるため、現状で実用的に使用するにはそれぞれの API などの polyfill を用意するなどなんらかの工夫が必要になると思います。
追記: 2013/02/10 23:10
先ほどリリースした zlib.js 0.1.4 ですが、PKZIP 構築時の DEFLATE 圧縮する際に本来ならば圧縮前の CRC32 が必要なところを圧縮後の CRC32 を計算してしまうというバグがありました。 このバグは致命的であると判断し、問題を修正した 0.1.5 をリリースしました。 今後はそちらをお使いください。zip.min.js および PKZIP 構築時以外ではこのバグの影響はありません。
0.1.4 を使用している場合でも、いくつかのアーカイバでは CRC32 のチェックを行わないため問題の起こらないケースもあります。また、CompressionMethod に STORE (無圧縮)を指定している場合も問題ありません。
バグの報告をしてくださった @stakamur さん、どうもありがとうございました。
https://developer.mozilla.org/en-US/docs/HTML/Element/a#Browser_compatibility