progress标签仅为视觉容器,需用javascript结合xmlhttprequest的upload.onprogress事件驱动进度更新:通过e.loaded/e.total计算百分比,动态设置progress.value和提示文本。

Progress 标签本身不能直接获取上传进度,它只是个视觉容器;真实进度必须由 JavaScript 结合 XMLHttpRequest 或 Fetch 的上传事件(如 upload.onprogress)驱动。
1. 基础结构:Progress 标签与上传触发绑定
在页面中放置一个 <progress></progress> 元素,并设置可读的初始状态:
<input type="file" id="fileInput"><br><progress id="uploadProgress" value="0" max="100">0%</progress><br><span id="progressText">等待上传...</span>
注意:value 表示当前完成值,max 默认为 100,适合百分比场景;也可设为文件总字节数(需同步更新 max)。
2. 使用 XMLHttpRequest 监听上传进度
XMLHttpRequest 支持 upload.onprogress 事件,能拿到已上传字节数和总大小:
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
- 创建
new XMLHttpRequest() - 监听
xhr.upload.onprogress = e => { ... } - 从事件对象
e中提取e.loaded(已传)和e.total(总量) - 计算百分比并更新
<progress></progress>的value属性
const xhr = new XMLHttpRequest();<br>xhr.upload.onprogress = function(e) {<br> if (e.lengthComputable) {<br> const percent = Math.round((e.loaded / e.total) * 100);<br> document.getElementById('uploadProgress').value = percent;<br> document.getElementById('progressText').textContent = `${percent}%`;<br> }<br>3. 后端需支持:不拦截、不缓存、返回明确响应
前端进度依赖后端及时响应上传流,常见坑点:
- 避免使用会缓冲整个请求体的中间件(如某些 Node.js body-parser 默认行为)
- PHP 需开启
upload_progress或用$_FILES+ 分块接收;Python Flask 可用request.stream.read()流式处理 - 确保服务器未启用 gzip 压缩请求体(可能干扰
Content-Length计算) - 跨域时后端必须返回
Access-Control-Allow-Headers: X-Requested-With等必要头
4. 替代方案:Fetch + Upload Stream(现代浏览器)
Fetch 本身不暴露上传进度,但可通过 ReadableStream 手动分块上传并计数:
- 读取
File.arrayBuffer()或用stream().getReader()分片读取 - 每发送一块,累加已发字节数,更新 progress
- 适合需要精细控制或断点续传的场景
注意:该方式兼容性略低于 XHR(如 Safari 对 ReadableStream 支持较晚),生产环境建议优先用 XHR 方案。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










