附件打包 ZIP(JSZip)
灵感:能力工具箱 file-zip(pkg: jszip)。
何时使用
- 多份合同/图片/跟进附件一次打成 zip 下载
- 纯前端打包,不经后端中转(注意体积与内存)
硬约束
- 使用
jszip;条目文件名清洗非法路径字符,禁止../。 - 空列表拒绝打包并提示。
- 大文件:提示内存风险;单次建议总大小有上限说明(如提示 >50MB 慎用)。
- 打包完成后触发下载(可配合
file-saver或URL.createObjectURL)。 - 交付可运行 TS/JS 片段;勿依赖仓库私有 API。
推荐实现要点
import JSZip from 'jszip'
export async function packFilesToZip(
files: Array<{ name: string; data: Blob | ArrayBuffer | string }>,
zipName = 'attachments.zip',
) {
if (!files?.length) throw new Error('请至少选择一个文件')
const zip = new JSZip()
for (const f of files) {
const safe = String(f.name || 'file').replace(/[\\/:*?"<>|]/g, '_').replace(/\.\./g, '')
zip.file(safe, f.data)
}
const blob = await zip.generateAsync({ type: 'blob' })
const url = URL.createObjectURL(blob)
const a = document.createElement('a')
a.href = url
a.download = zipName
a.click()
URL.revokeObjectURL(url)
return { ok: true, name: zipName }
}
Agent 执行步骤
- 实现打包函数;说明与
file-save可联用。 - 自测:2 个文本文件 → 可解压 zip。
- UI:进度可用
generateAsync的onUpdate。
附加
- README.md · reference.md · templates/usage.md