accept、acceptmime、exts三者缺一不可:accept控制浏览器文件选择框初始分类(仅images/file/video/audio四值),acceptmime写入input的accept属性并精确过滤系统级可见文件(须用标准mime如application/pdf),exts仅上传前校验文件名后缀(如"pdf|zip"),纯字符串匹配易被绕过,服务端必须二次校验。

accept、exts、acceptMime 三者必须同时配,缺一不可
只设 exts,用户仍能选中 .exe;只设 accept,系统弹窗不过滤;只设 acceptMime,Safari 可能直接忽略。三者分工明确:accept 控制浏览器文件选择框的初始分类(只能是 images/file/video/audio 四个值之一),exts 是上传前对文件名后缀的字符串匹配(如 "pdf|zip"),acceptMime 才真正写入原生 <input> 的 accept 属性,影响操作系统级可见类型。
acceptMime 必须写标准 MIME,不能拼错或简写
acceptMime: "pdf" 或 "file/pdf" 全无效,浏览器直接当空处理。正确写法必须是完整、标准的 MIME 类型,且多个用英文逗号分隔:
- PDF:
"application/pdf" - Excel (.xlsx):
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" - WebP 图片(兼容 Safari):
"image/webp, image/x-webp" - RAR 压缩包:
"application/x-rar-compressed"
Chrome 支持最全,Firefox 次之,Safari 最保守——上线前务必在目标浏览器里点开选择框,确认该类型文件是否真的“看不见”。
exts 校验纯靠后缀,完全不读文件内容
exts: "jpg|png" 只检查文件名是不是以 .jpg 或 .png 结尾,不解析二进制头。用户把 hacked.exe 改成 hacked.jpg 就能绕过。所以:
- 多后缀必须用竖线
|分隔,不能用逗号或空格:"jpg|jpeg|png"✅,"jpg, jpeg"❌ - 它只是前端友好提示,不是安全防线,服务端必须重新校验真实 MIME 和文件头
- 若需更严控制,得进
before回调,用obj.getChooseFiles()拿到File对象,读file.type或用FileReader读前几字节做 magic 校验
size 单位是 KB,不是 MB
size: 2048 表示 2MB,size: 5 表示 5KB——一张普通截图都可能超。注意:
- 超过限制时,
choose回调根本不会触发,你连文件列表都收不到 - 错误提示靠
text["limit-size"]自定义,不设就弹默认文案 “文件大小不能超过 XX KB” - 这只是第一道体验层筛子,服务端仍需独立校验
Content-Length和文件流大小,否则可被绕过
真正容易被忽略的是:Layui 在 choose 阶段就已过滤掉超限或后缀不符的文件,你甚至拿不到完整 files 列表;而 acceptMime 的兼容性差异,往往要等用户反馈“为什么我的 PDF 看不见”才暴露出来。











