zlib圧縮/解凍をJavaScriptでやりたい。
そんな時に使いやすいのを見つけました。
その名も pako というライブラリ
データとかファイルの圧縮と解凍、
そのやり方などをまとめておきます。
pakoはDeflate圧縮用zlibライブラリ
はじめにDeflateとかzlibの基礎知識について。
pakoはzlibに完全語感があります。
zlibとはDeflate圧縮用のライブラリのこと
▼ Deflate圧縮ってなんだ?
Deflate(デフレート)とはLZ77とハフマン符号化を組み合わせた可逆データ圧縮アルゴリズム。フィル・カッツが開発した圧縮ツールPKZIPのバージョン2で使われていた。ZIPやgzipなどで使われている。1996年5月に RFC 1951 としてドキュメント化された。ヘッダーやフッターをつけた zlib (RFC 1950) 形式や gzip (RFC 1952) 形式とともに使われる事が多い。
Deflateとは圧縮アルゴリズムのこと、
zlibやgzipをそれを使うライブラリのことです。
pakoはデータに対してDeflate圧縮を実行し、
それをUint8Arrayとしてzlib形式で取得できます。
pakoの読み込み or インストール
Node.js or ブラウザ単独どちらでも動かせます。
▼ GitHub : nodeca/pako
▼ npmからインストールする場合
1 |
npm install pako |
▼ ブラウザ側で動かす場合
1 2 3 |
<script src=" https://cdn.jsdelivr.net/npm/pako@2.1.0/dist/pako.min.js "></script> |
紹介するのはブラウザ側で動かす前提のコードです。
ですがNode.js版でもほとんど変わりません。
テキストをzlib圧縮/解凍する
pakoでは次のように圧縮データを扱います。
- 元データはUint8Arrayへの変換が必要
- 圧縮データはUint8Arrayとして返される
それに注意してテキストを圧縮してみます。
▼ とてもシンプルな圧縮例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/// 圧縮元のテキスト const input = "Hello World"; /// Deflate圧縮実行 const compressed = pako.deflate(input); console.log('compressed : ', compressed); /// => compressed : Uint8Array(19) try { /// 上記の圧縮データを解凍 const decompressed = pako.inflate(compressed); /// バイト配列をテキストとして復元 const output = new TextDecoder().decode(decompressed); console.log('output : ', output); /// => output : Hello World } catch (err) { console.log(err); } |
テキストの圧縮解凍はこのようになります。
ファイルをzlib圧縮/解凍する
次はバイナリも含めたファイルの圧縮解凍
▼ たとえば次のHTMLを用意します。
1 2 3 4 |
<div> <span>ファイルをアップロード</span><br> <input type="file" class="inputFile"> </div> |
ファイル選択用の input[type=file] です。
そして選択されたファイルをzlib圧縮し、
そのあと自動ダウンロードするコードがこれです。
▼ こちらのコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/// ファイル選択input取得 const $inputFile = document.querySelector('.inputFile'); /// ファイル選択イベント $inputFile.onchange = (e)=>{ const inputFile = e.target.files[0]; if (inputFile) { /// fileをUint8Arrayに変換 inputFile.arrayBuffer().then(buff => { /// Deflate圧縮 const output = pako.deflate(new Uint8Array(buff)); /// zlibファイルとしてダウンロード実行 const urlUtil = window.URL || window.webkitURL; const dataUrl = urlUtil.createObjectURL(new Blob([output])); const link = document.createElement('a'); link.href = dataUrl; link.download = 'output.zlib'; document.body.appendChild(link); link.click(); document.body.removeChild(link) }); } }; |
詳しい処理内容はコードのコメントに書かれています。
取得したfileをそのまま pako.deflate() に渡すことができないため、ArrayBufferへと変換してからzlib圧縮を実行してます。それ以外に特筆すべきことはありません。
▼ ちなみにJavaScriptでのダウンロード処理
上記などで解説したので興味のある方はどうぞ