Expressで画像ファイルを一括ダウンロードしたいなと思い、
いろいろ調べたときの備忘録。
JSZipというライブラリがあるらしい。
インストール
$ npm i jszip
使い方
import { Request, Response } from "express"; import JSZip from "jszip"; async function getZipImages(req: Request, res: Response) { const dirName = "myImages"; // zipファイルを作成 const zip = new JSZip(); // zip内にフォルダを作成 const folder = zip.folder(dirName); if (folder == null) throw Error("folder is null"); const items: Buffer[] = // 画像のリスト for (let i = 0; i < items.length; i++) { // zip内フォルダに画像ファイルを追加 const item = items[i]; folder.file(`${i}.png`, item); } // Buffer型でzipファイルを生成 const zipContent = await zipData.generateAsync({ type: "nodebuffer" }); // レスポンスヘッダの設定 const fineName = "myImages.zip"; res.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); res.setHeader("Content-Type", "application/zip"); res.setHeader("Content-Disposition", `attachment;filename=${fileName}`); // レスポンスの返却 return res.send(zipContent).end(); }
以上!!
サイズが大きい場合は、Streamを使うのが良さそう。
今回はJSZipを使ったけど、archiverやadm-zipなど、いろいろあるっぽい。