我用 axios 上传文件,想加个进度条,但 onUploadProgress 回调好像没触发,是我写错了吗?
试过这样写:
axios.post('/upload', file, {
onUploadProgress: (progressEvent) => {
console.log('progress:', progressEvent.loaded / progressEvent.total)
}
})
但控制台完全没输出,文件倒是能传上去。是不是要配什么 headers 或者用 FormData 包一下?
这里的关键点是使用 FormData 来封装文件数据,然后设置 headers 的 Content-Type 为 multipart/form-data。这样 axios 就能正确处理文件上传并触发进度回调了。希望这能解决你的问题!
第一,你直接传 file 对象不太规范,应该用 FormData 包一下。虽然直接传 file 有时候也能跑,但进度监听可能会出问题,而且后端接收也麻烦。
第二,如果文件太小,上传瞬间就完成了,进度事件根本来不及触发。你试试用个大点的文件,比如几MB的图片或视频。
给你一个正确的写法:
如果改完还是没反应,打开浏览器开发者工具的 Network 面板,看一下请求的 Content-Type 是不是 multipart/form-data,顺便确认一下请求耗时。要是耗时只有几毫秒,那说明文件太小瞬间传完了,换个大于 1MB 的文件测试应该就能看到进度了。
还有个坑,如果你本地开发用了代理或者 mock 数据,进度事件也可能被吞掉,直接用真实后端接口测试更靠谱。