【JSZip】前端图片打包下载实现

一、流程图

并发 fetch 图片 → 打包 zip → 触发下载
在这里插入图片描述

二、代码实现

import JSZip from 'jszip';

/**
 * 将图片 URL 列表打包为 zip 并下载(浏览器端,不依赖 file-saver)
 * @param imageUrls - 图片信息数组 { url: 图片地址, filename: zip 内文件名 }
 * @param zipName   - 下载的 zip 文件名
 */
async function downloadImagesAsZip(
  imageUrls: { url: string; filename: string }[],
  zipName: string = 'images.zip',
) {
  const zip = new JSZip();
  const folder = zip.folder('images')!;

  // 1. 并发 fetch 所有图片为 Blob,放入 zip
  const results = await Promise.allSettled(
    imageUrls.map(async ({ url, filename }) => {
      const res = await fetch(url, { mode: 'cors' });
      if (!res.ok) throw new Error(`HTTP ${res.status}`);
      const blob = await res.blob();
      folder.file(filename, blob);
    }),
  );

  // 2. 统计失败数量(可选)
  const failedCount = results.filter((r) => r.status === 'rejected').length;
  if (failedCount > 0) {
    console.warn(`${failedCount} 张图片下载失败,已跳过`);
  }

  // 3. 生成 zip Blob
  const zipBlob = await zip.generateAsync({ type: 'blob' });

  // 4. 触发浏览器下载(等效于 file-saver 的 saveAs)
  const blobUrl = URL.createObjectURL(zipBlob);
  const link = document.createElement('a');
  link.href = blobUrl;
  link.download = zipName;
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
  URL.revokeObjectURL(blobUrl); // 释放内存
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一颗不甘坠落的流星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值