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
オプション で指定可能な値base64
binarystring
array
uint8array
arraybuffer
blob
nodebuffer
- 参考サイト: 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)