文件上传的进度监听,是很多前端开发者会碰到的一个坎。尤其是在使用layui的upload模块时,progress回调要么不触发,要么看起来就像在跟自己过不去。其实这些问题大多有规律可循,只要把几个关键环节理清楚,调试起来就不至于那么痛苦了。progress回调不触发?先确认四个硬性条件最常见的情况是
文件上传的进度监听,是很多前端开发者会碰到的一个坎。尤其是在使用layui的upload模块时,progress回调要么不触发,要么看起来就像在跟自己过不去。其实这些问题大多有规律可循,只要把几个关键环节理清楚,调试起来就不至于那么痛苦了。
最常见的情况是写了progress却完全没输出,根本原因是layui压根没进入进度监听流程。必须同时满足以下四点,progress才会被调用:
长期稳定更新的攒劲资源: >>>点此立即查看<<<

layui 版本 ≥ 2.5.5(查 layui.version,旧版无此回调)auto: false(默认为 true,此时 progress 被跳过)before 回调中 显式 return false(仅写 before 不够,漏掉这句就自动发请求)url 配置正确,且后端接收方式支持 multipart/form-data(传 base64 或普通 json 会导致浏览器无法上报已发送字节数)所有文件共用同一个 lay-filter="demo",结果就是后一个文件的进度直接刷掉前一个——这不是 bug,而是 element.progress() 的匹配逻辑决定的。
"progress-" + indexlay-filter 的进度条:progress 回调里调用 element.progress("progress-" + index, n + "%")done 或 error 里手动设为 "100%",否则可能卡在 99%progress 里的 n 是浏览器发出请求体的完成度,不是服务端处理结果。常见错误是在 progress 里判断 n === 100 就隐藏 loading 或启用按钮。
n === 100 只表示“发完了”,done 才代表“服务器返回了成功响应”progress 到 100% 后常要等几秒才进 done(服务端校验、写磁盘、网络延迟)99% 不动,大概率是服务端配置问题(如 Nginx client_max_body_size、PHP upload_max_filesize 限制)进度事件依赖 XMLHttpRequest.upload.onprogress,IE10+ 才有,IE9 及以下浏览器压根不会触发 progress 回调。
client_max_body_size 1m,PHP 默认 upload_max_filesize 2Merror、也收不到 done侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述