JavaScript で複数画像を zip に圧縮してローカルにダウンロード
はじめに
ページ中の複数の画像を zip に圧縮してローカルにダウンロードする方法を整理した。
※JavaScript で画像をローカルにダウンロード の続き
TL;DR
- Stuk/jszip を使って zip を生成
await Promise.all()ですべての非同期リクエストが完了したら zip 生成処理を実施folder(),folder.file(),generateAsync()で、zip ファイルの生成- zip 生成後のダウンロード処理は前回と同じ
createObjectURL→<a href="..." download="xxxx.zip">→ クリック&削除
目次
環境・条件
- Google Chrome バージョン: 79.0.3945.88(Official Build) (64 ビット)
- jszip v3.2.1 (CDN)
詳細
「いらすとや トップページの『〇〇のイラスト』の画像をまとめてダウンロード」を例にダウンロードボタンを作る。

完成形
前回 と同様に、先に完成形。
1 | // jszip を CDN から読み込み |
上記スクリプトを Dev tools のコンソールで実行すると、トップにボタンが配置される。

このボタンをクリックすると、 いらすとや バナー.zip がダウンロードされるはず。
展開すると下記のような感じ。

解説
関数単位で簡単に解説。
jszip を CDN から読み込み: loadJSZipFromCDN
1 | // jszip を CDN から読み込み |
headに jszip 読み込みのscriptタグを追加npmなどでインストールして使用する場合は不要
ボタン追加: addImageDownloadButton
1 | // 一括ダウンロードボタンの追加 |
- 前回 と同じなため省略
画像リクエスト: downloadImages
1 | // 画像の一括ダウンロード |
- バナー画像には
"#section_banner img"でアクセス可能querySelectorAllの戻り値NodeListはforEachやmapが使えないので、[].slice.callで変換- 最近だと
Array.from()とか[...nodeList]みたいな感じでも良いっぽい
- 最近だと
- 「画像がすべて取得できたら zip 生成」としたいので、リクエスト処理を
new Promiseで wrap await Promise.all()ですべての非同期リクエストが完了するのを待つPromise.all()は、1つでもrejectで返却されるとその時点で終了する(っぽい(未検証))ので、onerrorなどでもresolveを使っている- ちゃんと確かめてないので間違ってるかも
zip 生成: generateImagesZip
1 | // zip ファイルで画像をダウンロード |
folder()で、フォルダの生成folder.file()で、フォルダ下にファイルを配置(生成)- 対応フォーマットは下記
- String
- ArrayBuffer
- Uint8Array
- Buffer
- Blob
- Promise
- Nodejs stream
- 対応フォーマットは下記
generateAsync()で、zip ファイルの生成typeをblobで生成することで、あとの処理は前回 と同じ流れcreateObjectURL→<a href="..." download="xxxx.zip">→ クリック&削除
まとめ
- Stuk/jszip を使って zip を生成
await Promise.all()ですべての非同期リクエストが完了したら zip 生成処理を実施folder(),folder.file(),generateAsync()で、zip ファイルの生成- zip 生成後のダウンロード処理は前回と同じ
createObjectURL→<a href="..." download="xxxx.zip">→ クリック&削除
その他・メモ
generateAsync()のtypeオプション で指定可能な値base64binarystringarrayuint8arrayarraybufferblobnodebuffer
- 参考サイト: JSZipによるファイル一括DL - pixiv inside [archive] では、zip ファイルの保存を eligrey/FileSaver で行っている
参考文献
- Stuk/jszip: Create, read and edit .zip files with Javascript
- JSZip API
- JSZipによるファイル一括DL - pixiv inside [archive]
- Promiseと仲良くなって気持ち良く非同期処理を書こう - Qiita
- Promise.all() - JavaScript | MDN
関連記事
- jQuery Select2 で、初期値の設定と選択状態のクリア
- JavaScript で画像をローカルにダウンロード
- HTML img タグで画像が 404 エラーのときに代替画像を表示する方法
- mailto リンクで 宛先/CC/BCC/件名/本文 を指定 (JavaScript サンプルあり)
- Chart.js(vue-chartjs) でツールチップの表示内容を変更
- Vue.js で日本語変換での誤発火を抑止しつつ Enter キーで Submit
- JavaScript で URL のクエリパラメータを操作する方法
- axios で添付ファイルありのリクエスト(multipart/form-data の POST)