Layui文件上传进度监听方法

作者:技术拾光

时间:2026-07-05

浏览:357

文件上传的进度监听,是很多前端开发者会碰到的一个坎。尤其是在使用layui的upload模块时,progress回调要么不触发,要么看起来就像在跟自己过不去。其实这些问题大多有规律可循,只要把几个关键环节理清楚,调试起来就不至于那么痛苦了。progress回调不触发?先确认四个硬性条件最常见的情况是

文章目录

文件上传的进度监听,是很多前端开发者会碰到的一个坎。尤其是在使用layui的upload模块时,progress回调要么不触发,要么看起来就像在跟自己过不去。其实这些问题大多有规律可循,只要把几个关键环节理清楚,调试起来就不至于那么痛苦了。

progress回调不触发?先确认四个硬性条件

最常见的情况是写了progress却完全没输出,根本原因是layui压根没进入进度监听流程。必须同时满足以下四点,progress才会被调用:

Layui文件上传进度监听方法

  • 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% 不动,大概率是服务端配置问题(如 Nginx client_max_body_size、PHP upload_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 配置,最后看前端逻辑

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章