layui的accept仅影响文件选择框提示,exts和size才真正校验,但需auto:false或手动上传;exts大小写敏感且不含点;size单位为KB;IE兼容模式下files为空需加X-UA-Compatible。
layui upload 设置 accept 和 exts 为什么没生效
因为 accept 是服务端校验的“提示字段”,真正起作用的是 exts(扩展名白名单)和 size(字节限制),但必须配合 auto: false 或手动触发上传,否则默认走浏览器原生 input[type="file"] 的过滤逻辑,layui 不会拦截或二次校验。
常见错误现象:accept="images" 却能选中 .zip;exts: "jpg,png" 但用户拖入 .exe 仍进入预览列表。
-
accept只影响文件选择对话框的默认筛选类型(如"images"显示图片类后缀),不是安全控制手段 -
exts必须是逗号分隔的小写后缀字符串(不含点),比如"pdf,docx,xlsx",大小写敏感 - 如果用了
auto: true(默认),Layui 会在用户选中后立刻读取文件,此时exts和size才真正参与校验——但仅限于前端 JS 层面,不阻止用户重复选择 - 想彻底禁用非法类型,得在
choose回调里手动return false并提示
layui upload 的 size 限制单位是 KB 不是 byte
size 参数单位是千字节(KB),不是字节(byte),这是最常被踩的坑。设 size: 2048 表示最大 2MB,而不是 2KB。
使用场景:上传合同 PDF 通常限制 10MB,就得写 size: 10240;头像图限制 2MB 就是 size: 2048。
- 超过
size时,choose回调里obj.files为空,且触发error回调,但不会自动弹出提示,需自行layer.msg() - 注意:该限制只对单个文件生效,不适用于多文件上传时的总大小校验
- 服务端仍需做独立大小校验,前端限制可被绕过(如改请求体)
如何在 choose 回调里做自定义格式/大小拦截
靠 exts 和 size 不够细粒度?比如要禁止 .bmp、或要求图片宽高 ≥ 800px,就得进 choose 回调手动处理。
关键点:在回调里遍历 obj.files,用 file.name 提取后缀,file.size 拿字节数,再 obj.preview() 前决定是否 return false。
upload.render({
elem: '#upload',
exts: 'jpg,png',
size: 2048,
choose: function(obj){
var files = obj.files;
for(var i = 0; i < files.length; i++){
var f = files[i];
var ext = f.name.slice(f.name.lastIndexOf('.') + 1).toLowerCase();
if(ext !== 'jpg' && ext !== 'png'){
layer.msg('只支持 JPG/PNG 格式');
return false;
}
if(f.size > 2048 * 1024){ // 注意:这里单位是 byte
layer.msg('单个文件不能超过 2MB');
return false;
}
}
obj.preview(function(index, file, result){
// 预览逻辑
});
}
});IE10+ 下 multipart/form-data 上传失败的隐藏原因
Layui upload 默认用 iframe 模拟异步上传,在 IE10+ 且开启兼容模式时,input[type="file"] 的 files API 不可用,导致 choose 回调里 obj.files 为 undefined,进而 exts 和 size 全部失效。
这不是配置问题,是 IE 的 DOM 能力缺失。解决方案只有两个:
- 强制关闭 IE 兼容视图(在页面
<head>加<meta http-equiv="X-UA-Compatible" content="edge">) - 降级使用传统表单提交(
auto: false+ 手动submit()),放弃前端校验,全交给后端
别指望 polyfill —— IE 对 FileList 的支持是硬伤,连 Object.keys(file) 都可能报错。


















