必须显式设置 auto: false,否则 choose 回调不触发;choose 中需用 Array.from(obj.files) 转换文件列表,校验逻辑应放 choose 里,上传动作延至用户明确操作时执行。

必须显式设置 auto: false,否则默认就是自动上传。 这是绝大多数人踩坑的起点——没配这个,choose 回调根本不会触发,更别提拦截或手动控制了。
为什么 auto: false 是前提
layui upload 的 auto 默认值是 true,只要用户选中文件,它立刻发起请求。此时 choose 回调压根不执行,你写的逻辑全被跳过。
-
choose只在auto: false时才有效,它是“选择后、上传前”的唯一可控窗口 - 不设
auto: false,哪怕写了choose函数,控制台也看不到任何输出 - 后端收到的请求会显得“莫名其妙”:没点按钮却已上传,且无法校验文件名、大小或关联表单字段
choose 回调里不能直接调 obj.upload()
设了 auto: false 后,choose 确实能拿到文件列表,但常见错误是马上执行 obj.upload() —— 这会导致每个文件单独发一次请求,不是你想要的“先收集、再统一传”。
-
obj.upload()每次只接受一个File对象,传obj.files(FileList)会报错或静默失败 - 想批量处理,得先把
obj.files转成数组:Array.from(obj.files) - 真正上传动作要延后到按钮点击、表单提交等明确用户意图的时机,而不是在
choose里自动触发
需要校验时,before 回调可能失效
如果你用的是较老版本 layui(比如 v2.4.5),before 回调里 return false 是拦不住上传的——这个 bug 直到 v2.6.7 才修复。
- 检查当前 layui 版本:
layui.v,低于2.6.7就别依赖before阻止上传 - 稳妥做法是:把校验逻辑全挪到
choose里,校验不通过就什么也不做;校验通过再缓存文件,等后续手动上传 - 如果非要用
before,升级到v2.6.8+或手动 patchupload.js中的判断逻辑
最易忽略的一点:choose 拿到的是 FileList,不是普通数组,也不能直接塞进 FormData;必须转成数组再遍历 append,否则后端收不到全部文件。


















