layui upload 的 number 参数仅限制单次文件选择操作最多选中几个文件,而非整个队列总数;它对原生 input[type=file] 有效,不感知已删/已传/已取消文件,且 layui 2.8+ 才支持,需配合 multiple: true 使用。
number 参数到底限制什么number 不是“整个上传队列最多几个文件”,而是“单次 choose 操作最多允许选中几个文件”。它只对点击按钮触发的原生 <input type="file"> 有效,且不感知已删除、已上传或已取消的文件状态。
常见误解:设了 number: 3 就以为用户总共只能传 3 个——错。用户点两次“选择文件”,每次选 3 个,照样能凑出 6 个待上传文件。
number,必须手写逻辑number,但仅作用于单次选择动作,不是全局计数器multiple: true 配合才有意义;单独设 number 无效layui 默认行为是:每个文件单独发一个请求(auto: true 时),所谓“同时上传”其实是浏览器并发 HTTP 请求,不受 layui 控制。要限制并发数,得靠手动节流 + 队列调度。
关键不是拦住用户选文件,而是控制 obj.upload() 的调用节奏:
pendingFiles = [])maxConcurrent = 3
running = 0 跟踪当前正在上传的请求数obj.upload(index, file) 前判断 if (running ,否则入队等待
done 或 error 回调里 running-- 并尝试启动下一个注意:obj.upload() 是 layui 内部方法,不能直接传数组;必须逐个调用,靠你自己串起队列。
acceptNum 或 multiple 实现并行控制acceptNum(layui 2.8+ 新增)和 multiple 都不涉及网络层调度:
multiple: true 只影响是否允许多选,不影响请求并发acceptNum: 3 和 number 类似,仅限制单次 <input> 选择数量,且对拖拽上传无效acceptNum 和 number,直接进 choose 回调如果你真需要精确控制并发数(比如限 3 个请求同时跑),别走 layui 的 upload 流程,改用原生 fetch + Promise.allSettled 分批处理:
auto: false,在 choose 中收集全部 File 对象到 allFiles
uploadBatch(files) 函数,每次取 maxConcurrent 个,构造 FormData 发送Promise.allSettled() 等这批完成,再取下一批files[] 字段的 multipart 请求这样你才能真正掌控并发粒度,也避开 layui 内部上传逻辑的不可控行为。复杂点在于要自己处理进度、重试、错误聚合——但这是换来的确定性。