node.jsで簡単にzip圧縮できる NodeZip の使い方と留意点

node.jsでファイル・フォルダのzip圧縮

ググると次ライブラリの記事がヒットします

  • Archiver
  • ADM zip

僕も最初はこの2つを使ってみたものの...
なぜか環境的な要因もあって動いてくれない。

そこで代替としてNodeZipを試してみました。

意外と良かったので使い方とか書いておきます。

1.node.zipをnpmからインストールする

このライブラリはGitHubで公開されてます。

▼ Github : daraosn / node-zip

ライセンスもMITなので安心です

インストールはnpmから次コマンドでOK

このNodeZipですが当然ながらzipの圧縮・解凍をサポートしており、できあがったzipファイルはBase64エンコードして文字列としても取得できます。

あと僕が気に入ってるのはファイル・ディレクトリの追加メソッドが本当に分かりやすい点ですね。Archiverとかも良いけど、シンプルさにおいては一番です。

2.普通のテキストファイルをzipに追加してみる

まずはファイルの追加から

テキストファイルを追加するのは簡単です。

▼ こんな感じのサンプルコード

NodeZipではfileメソッドを使ってzipにファイルを追加できます。テキストの場合は第2引数にコンテンツをそのまま渡せばOKですね。(文字コードとかの指定は調査中...)

3.バイナリファイル(画像)をzipに追加してみる

少し厄介なのが画像とかのバイナリファイルの追加

画像の場合はこういうメソッドです。

▼ バイナリファイル(画像)の追加コード例

これが少し分かりにくい。

バイナリを扱うときの鉄則みたいなもので、バイナリデータを直接保存するメソッドっていうのはありません。何かしらエンコードされた形式が必要です。

つまりバイナリを直接渡すのではなく、DataURLなどに変換してからBase64だけを抜き出して突っこむ感じですね。DataUrlについては次記事とかを見てください

▼ Data URLスキームとは何なのか?

▼ JSで画像をbase64形式のURLに変換するやり方

バイナリファイルの追加はDataURL経由で行うこと

4.最後はgenerateメソッドでzip圧縮して保存

実際のzip圧縮はgenerateメソッドでできます

▼ zip圧縮のサンプルコード

このコードでは zip.generate({base64:true,compression:'DEFLATE'}) として圧縮方式にDEFLATEを指定してます。あとはBase64エンコードされたzipファイルの文字列が返ってくるのでDataURLとして取得可能

あとはダウンロードリンクとかにDataURLをセットしたり、ダウンロード処理とかを書けばOKです。(参考記事 : https://pisuke-code.com/js-ways-to-dl-image-from-link/

5.ディレクトリ追加はfolderメソッドを使う

それからzipの利点は階層構造(フォルダ)を持てること

そのフォルダ追加はfolderメソッドでできます

▼ フォルダ追加のコード例

zip生成に欠かせないメソッドです

注意点 : NodeZipのAPIリファレンスについて

このNodeZipライブラリの懸念点として・・・

なぜかリファレンスページが存在してないことです

▼ なぜ?公式がリンク切れしてる模様

公式 : https://stuartk.com/jszip/

ただWaybackMachinにアーカイブが見つかりました。

アーカイブ : https://web.archive.org/web/20120719154711/https://stuartk.com/jszip/

ここにfile・folderメソッド・その他メソッドのサンプルコードも載ってるので、NodeZipの使い方を知りたいならこちらを参考に (-_-;)

公式はもう開発終了してるんですが、zip圧縮するならこれで十分だと思います。ファイル・フォルダ追加の方法もシンプルで分かりやすいので

以上、NodeJSの導入とか使い方でした。ではまた