node.jsでファイル・フォルダのzip圧縮
ググると次ライブラリの記事がヒットします
- Archiver
- ADM zip
僕も最初はこの2つを使ってみたものの...
なぜか環境的な要因もあって動いてくれない。
そこで代替としてNodeZipを試してみました。
意外と良かったので使い方とか書いておきます。
このページの目次
1.node.zipをnpmからインストールする
このライブラリはGitHubで公開されてます。
▼ Github : daraosn / node-zip
ライセンスもMITなので安心です
インストールはnpmから次コマンドでOK
1 |
npm install node-zip |
このNodeZipですが当然ながらzipの圧縮・解凍をサポートしており、できあがったzipファイルはBase64エンコードして文字列としても取得できます。
あと僕が気に入ってるのはファイル・ディレクトリの追加メソッドが本当に分かりやすい点ですね。Archiverとかも良いけど、シンプルさにおいては一番です。
2.普通のテキストファイルをzipに追加してみる
まずはファイルの追加から
テキストファイルを追加するのは簡単です。
▼ こんな感じのサンプルコード
1 2 3 4 |
var zip = new require('node-zip')(); /// テキストファイル追加 zip.file('test.file', 'hello there'); |
NodeZipではfileメソッドを使ってzipにファイルを追加できます。テキストの場合は第2引数にコンテンツをそのまま渡せばOKですね。(文字コードとかの指定は調査中...)
3.バイナリファイル(画像)をzipに追加してみる
少し厄介なのが画像とかのバイナリファイルの追加
画像の場合はこういうメソッドです。
▼ バイナリファイル(画像)の追加コード例
1 2 3 4 5 6 7 8 9 10 11 12 |
let zip = new require('node-zip')(); /// 画像をDataUrlに変換しておく const imgDataUrl = 'data:image/jpeg;base64,ivb...' /// Base64部分だけを抜き出す const imgBase64 = imgDataUrl.replace( 'data:image/jpeg;base64,', '') zip.file('hoge.png', imgBase64, { base64: true }) |
これが少し分かりにくい。
バイナリを扱うときの鉄則みたいなもので、バイナリデータを直接保存するメソッドっていうのはありません。何かしらエンコードされた形式が必要です。
つまりバイナリを直接渡すのではなく、DataURLなどに変換してからBase64だけを抜き出して突っこむ感じですね。DataUrlについては次記事とかを見てください
▼ Data URLスキームとは何なのか?
▼ JSで画像をbase64形式のURLに変換するやり方
バイナリファイルの追加はDataURL経由で行うこと
4.最後はgenerateメソッドでzip圧縮して保存
実際のzip圧縮はgenerateメソッドでできます
▼ zip圧縮のサンプルコード
1 2 3 4 5 6 7 8 9 |
var zip = new require('node-zip')(); /// ファイルとかフォルダ追加 /// DataUrlとしてzipファイルを取得 const zipDataUrl = 'data:application/zip;base64,' + zip.generate({base64:true,compression:'DEFLATE'}); /// リンクなどから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メソッドでできます
▼ フォルダ追加のコード例
1 2 3 4 5 |
/// ルートにディレクトリ追加 zip.folder('hoge') /// 子ディレクトリを作成 zip.folder('hoge/fuga') |
zip生成に欠かせないメソッドです
注意点 : NodeZipのAPIリファレンスについて
このNodeZipライブラリの懸念点として・・・
なぜかリファレンスページが存在してないことです
▼ なぜ?公式がリンク切れしてる模様
公式 : https://stuartk.com/jszip/
ただWaybackMachinにアーカイブが見つかりました。
アーカイブ : https://web.archive.org/web/20120719154711/https://stuartk.com/jszip/
ここにfile・folderメソッド・その他メソッドのサンプルコードも載ってるので、NodeZipの使い方を知りたいならこちらを参考に (-_-;)
公式はもう開発終了してるんですが、zip圧縮するならこれで十分だと思います。ファイル・フォルダ追加の方法もシンプルで分かりやすいので
以上、NodeJSの導入とか使い方でした。ではまた