くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

Expressで画像ファイルをzip形式でダウンロードする

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を使ったけど、archiveradm-zipなど、いろいろあるっぽい。

参考にしたサイトさま