layui 不支持前端打包 zip,必须用 jszip + formdata 手动构造请求;因其 upload 模块仅转发文件、不压缩,multiple: true 仍是多次单文件上传,非 zip 流。

Layui 本身不支持前端打包 ZIP,必须用 JSZip + FormData 手动构造请求,否则后端收不到 zip 包。
为什么不能直接用 layui.upload 发多个文件当 zip
Layui 的 upload 模块只做文件转发,不提供压缩能力;即使设 multiple: true,它也只是把每个 File 单独发一次请求(或逐个发),根本不会合成 ZIP。你看到的“多文件上传”,本质是 N 次单文件 POST,不是 ZIP 流。
- 想传 ZIP,就得在前端用
JSZip把所有File对象读取为Blob,再打包成 ZIPBlob - 然后禁用
auto: true,在choose回调里缓存files,等用户点按钮再触发压缩+上传 - 最后用
fetch或$.ajax提交这个 ZIPBlob,字段名按后端要求设(如file或zip)
JSZip 打包多个 File 并上传的实操要点
核心是:读取每个 File → 转成 Uint8Array → 加进 JSZip → 生成 Blob → 塞进 FormData。
- 必须用
JSZip.loadAsync(file)读图片/文本类文件;但普通二进制文件(如 PDF、DOCX)要用file.arrayBuffer()再转Uint8Array,否则中文路径或非 UTF-8 内容会乱码 - ZIP 内文件名建议用
file.name,不要改;若需加目录结构(如uploads/xxx.jpg),就传完整路径字符串给zip.file(path, content) -
JSZip.generateAsync({type: 'blob'})是异步的,得用await或.then(),不能在for...in里同步调用 - 生成的 ZIP
Blob传给formData.append('file', blob, 'archive.zip'),第三个参数是最终文件名,后端靠它识别类型
容易漏掉的关键限制
大文件(单个 >100MB)或大量文件(>200 个)打包时,JSZip 会吃光内存并卡死页面——这不是代码 bug,是浏览器限制。
- 务必加数量和总大小校验:
files.length a + f.size, 0) - 不要在
choose回调里直接执行打包,先存files,等用户点「压缩上传」按钮再跑;否则选完就卡住,体验极差 - IE11 不支持
JSZip.generateAsync,必须降级到generate({type: 'base64'})再手动转 Blob,但 base64 体积增 33%,慎用 - 移动端 Safari 对 Blob URL 生命周期敏感,
URL.createObjectURL(zipBlob)生成的预览链接可能秒失效,别依赖它做上传前校验
真正难的不是写几行 JSZip 代码,而是处理各种边界:文件名含 emoji、空格、斜杠,读取失败时的 fallback,以及用户中途关页导致的 ZIP 构建中断。这些没法靠一个 upload.render() 解决,得自己兜底。











