文件上传的进度监听,是很多前端开发者会碰到的一个坎。尤其是在使用layui的upload模块时,progress回调要么不触发,要么看起来就像在跟自己过不去。其实这些问题大多有规律可循,只要把几个关键环节理清楚,调试起来就不至于那么痛苦了。progress回调不触发?先确认四个硬性条件最常见的情况是
Layui文件上传进度监听方法
作者:技术拾光
时间:2026-07-05
浏览:357
文章目录
文件上传的进度监听,是很多前端开发者会碰到的一个坎。尤其是在使用layui的upload模块时,progress回调要么不触发,要么看起来就像在跟自己过不去。其实这些问题大多有规律可循,只要把几个关键环节理清楚,调试起来就不至于那么痛苦了。
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 必须唯一
所有文件共用同一个 lay-filter="demo",结果就是后一个文件的进度直接刷掉前一个——这不是 bug,而是 element.progress() 的匹配逻辑决定的。
- 每个文件生成独立标识,例如
"progress-" + index - HTML 中动态插入带不同
lay-filter的进度条: progress回调里调用element.progress("progress-" + index, n + "%")- 别忘了在
done或error里手动设为"100%",否则可能卡在99%
n === 100 并不等于上传成功
progress 里的 n 是浏览器发出请求体的完成度,不是服务端处理结果。常见错误是在 progress 里判断 n === 100 就隐藏 loading 或启用按钮。
n === 100只表示“发完了”,done才代表“服务器返回了成功响应”- 大文件场景下,
progress到100%后常要等几秒才进done(服务端校验、写磁盘、网络延迟) - 建议加中间态提示,比如“正在保存…”而非立刻切换 UI 状态
- 若进度卡在
99%不动,大概率是服务端配置问题(如 Nginxclient_max_body_size、PHPupload_max_filesize限制)
IE9 及以下不支持,且服务端限制比前端代码更关键
进度事件依赖 XMLHttpRequest.upload.onprogress,IE10+ 才有,IE9 及以下浏览器压根不会触发 progress 回调。
- 前端代码再完美,服务端上传限制没调大,照样卡住:Nginx 默认
client_max_body_size 1m,PHP 默认upload_max_filesize 2M - 这些限制导致连接提前关闭,前端看到进度停在某个值、无
error、也收不到done - 排查顺序应是:先确认服务端日志是否有 413 错误,再查 Nginx/PHP 配置,最后看前端逻辑
实用工具推荐
电子包浆
使用 ›绿化、压缩、噪点和虚拟水印,自由调节做旧程度。
图片压缩
使用 ›选择画质和输出格式,预览压缩前后的大小。
相关文章