Layui上传组件用size参数限制单文件大小(单位KB),如size: 2048表示2MB;超限文件在choose回调前即被底层过滤,obj.files中不可见;错误提示默认为“文件大小不能超过XX KB”,可自定义text["limit-size"];accept、exts、acceptMime须协同使用且缺一不可,服务端必须二次校验以防绕过。
size参数单位是KB,不是MB
写size: 2048才是2mb,size: 5实际只允许5kb——一张稍大的png图就超限。layui底层在choose回调前就过滤掉超限文件,你根本收不到它,obj.files里压根没有这条记录。
错误提示默认是“文件大小不能超过 XX KB”,想改文案得用text["limit-size"]函数,比如:
text: {
"limit-size": function(file) {
return '文件 "' + file.name + '" 超过 2MB,请重选';
}
}
- 服务端必须二次校验,前端限制可被绕过(如改请求体或直接发POST)
- 多文件上传时,
size仍按单个文件算,不是总和 - IE9及以下不支持
size校验,会静默跳过
accept、exts、acceptMime三者缺一不可
accept: "images"只是让系统选择框默认显示图片类文件,用户仍能点“所有文件”强行选.exe;exts: "jpg|png"只校验文件名后缀,改个xxx.jpg.exe就能骗过;acceptMime: "image/jpeg"才真正控制原生<input type="file">的accept属性,但必须用标准MIME(file/zip无效,得写application/zip)。
推荐组合示例(上传压缩包):
accept: "file", exts: "zip|rar|7z", acceptMime: "application/zip,application/x-rar-compressed,application/x-7z-compressed"
-
accept: "file"别省,否则acceptMime可能被忽略 - Safari旧版本对
acceptMime支持弱,exts是最后一道防线 - 多个MIME用英文逗号分隔,中间**不能有空格**
多文件上传时格式校验逻辑很严格
开启multiple: true后,只要所选文件中任意一个后缀不符exts或大小超size,整个批次都会被拦在choose回调外——你连obj.files都拿不到,更别说逐个判断。
如果需要“部分失败、部分成功”,只能关掉multiple,改成单次选一个文件,或者自己用原生<input type="file" multiple> + FileList手动拆解校验。
-
obj.getChooseFiles()在批量拦截时返回空数组,不是undefined - 想给用户明确提示哪几个文件被拒?做不到——Layui不暴露具体被过滤的文件信息
- 服务端接收时仍要按文件单独校验,不能依赖前端传来的“已通过”标识
视频/音频等需元信息校验的场景不能只靠配置
accept: "video"和exts: "mp4"拦不住伪造后缀的文件,也判不了时长或分辨率。真要限制10分钟以内,得在choose里用URL.createObjectURL创建临时地址,加载<video></video>标签,等onloadedmetadata触发后读video.duration。
但注意:大视频加载慢、部分格式(如HEVC)浏览器不支持解码、移动端可能卡死——这种校验只适合小视频(≤50MB),且必须配合服务端ffprobe二次验证。
- Chrome/Firefox支持较好,Safari对
video.duration有时返回Infinity - 调用
upload.abort()后记得URL.revokeObjectURL()释放内存 - 别在
before里做这个操作,此时文件还没进队列,obj.files为空
acceptMime,用户能看到不该看的文件;漏掉exts,后缀伪造就生效;漏掉服务端校验,整套前端逻辑形同虚设。最常被忽略的是:多文件上传时的“全有或全无”校验逻辑,以及视频类文件必须前后端双校验的硬性要求。











