acceptmime控制文件选择框可见类型,accept仅设大类开关;exts只校验文件名后缀且易被绕过,无法影响弹窗显示。
必须配 accept + acceptmime,光靠 exts 完全无效——它不控制文件选择框,只做上传前的字符串后缀检查。
accept 和 acceptMime 谁管文件选择框的可见类型
accept 是浏览器弹窗的“大类开关”,只能是 images / file / video / audio 四个值之一;它本身不识别具体后缀。
真正过滤系统文件选择框里显示哪些文件的,是 acceptMime ——它传给浏览器一个 MIME 类型列表,由操作系统和浏览器联合决定是否展示该文件。
- 想只看到 PDF:必须设
accept: 'file'+acceptMime: 'application/pdf' - 想同时看到 Excel 和 Word:
acceptMime: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.openxmlformats-officedocument.wordprocessingml.document' -
acceptMime值必须严格匹配标准,pdf或file/pdf都无效,application/pdf才行 - Safari 对 WebP 支持差,得写成
image/webp, image/x-webp才稳妥
exts 只校验文件名后缀,且极易被绕过
exts 在用户点选完文件、点击“打开”之后才运行,它只是把 file.name 拿出来用 .split('.').pop() 算后缀,再比对你写的字符串。它不读文件内容,也不影响弹窗行为。
- 设了
exts: 'pdf'却能选中report.txt?因为accept还是默认images,或没配acceptMime,弹窗根本没过滤 - 用户把
hack.exe改名为doc.pdf,exts会放行——但后端必须用文件头(magic number)+ 真实 MIME 再校验一次 - 多后缀必须用竖线分隔:
exts: 'jpg|jpeg|png'✅,exts: 'jpg, jpeg'❌
before 回调才是唯一能读取真实文件信息的地方
如果你需要基于文件实际类型(file.type)、大小、甚至二进制头做判断,before 是唯一入口。这里可以同步返回 false 或异步返回 Promise.reject() 阻止上传。
- 示例:拒绝
type不是text/plain的 .txt 文件(防伪装):before: function(obj) { var files = obj.getChooseFiles(); if (files.length && files[0].type !== 'text/plain') { layer.msg('请上传真实的文本文件', {icon: 2}); return false; } } - 注意:
file.type由浏览器根据文件头或扩展名推测,不可全信,但比exts强得多 - 若需精确校验(如确认 ZIP 是否真为 ZIP),得用
FileReader读前 4 字节比对 magic number
别指望 exts 能守住第一道门;acceptMime 才是控制文件选择框的关键,但它依赖浏览器实现,上线前务必在目标环境(尤其 Safari)实测弹窗是否真的过滤了无关文件。











