number: 1 不起作用是因为 layui 的 number 参数仅在 multiple: true 时生效,控制单次选择的文件数量上限,而非累计上限;未开启 multiple 或重复点击选择时均无效,须在 choose 回调中通过 obj.pushfile() 手动校验并维护 pendingfiles 计数器。

为什么 number: 1 不起作用
Layui 的 number 参数只在 multiple: true 开启时才有意义,它控制的是“单次选择中最多允许几个文件”,不是整个组件生命周期内的累计上限。如果你没开 multiple,写 number: 1 完全无效;如果开了 multiple: true 但用户反复点击选择按钮,number 也拦不住第二次选——它不跟踪已选/已上传状态。
choose 回调里手动拦截超限文件
这是唯一可靠方式。Layui 在 choose 阶段暴露 obj.pushFile(),返回一个带索引键的对象(如 {0: File, 1: File}),必须用 Object.keys(obj.pushFile()).length 获取真实数量。
- 定义一个全局数组(如
pendingFiles = [])记录当前待上传的文件 - 在
choose中计算:Object.keys(files).length + pendingFiles.length > max - 超限时直接
return false,阻止后续流程(包括预览、上传队列建立) - 不超限才把新文件推入
pendingFiles,并更新 UI 显示数量
拖拽上传也要同步校验
很多人只测试了点击选择,忘了 dragend 事件也会触发 choose 回调。如果你的限制逻辑只写在 click 场景下,拖入多个文件时就会绕过校验。
- 确保所有入口(点击、拖拽)都走同一套
choose校验逻辑 - 不要依赖 DOM 层级或事件类型做分支判断,统一用
obj.pushFile()提取文件 - 拖拽时浏览器可能一次传入多个文件,
Object.keys(files).length依然准确
别混淆 size 和数量限制
size 是单文件大小(单位 KB),和文件个数完全无关。有人误以为设 size: 5120(5MB)就能限制总大小,结果用户选 10 个 500KB 文件照样通过——因为每个都 ≤ 5MB。
- 数量限制靠
choose+ 计数器 - 单文件大小靠
size - 总大小限制也得在
choose里遍历obj.files累加file.size - 三者逻辑独立,不能互相替代
done 或 error 回调里从 pendingFiles 中移除对应文件,否则下次选文件时计数会持续累积。











