我用 axios 上传文件,想加个进度条,但 onUploadProgress 回调好像没触发,控制台也没报错。
试过这样写:
axios.post('/upload', file, {
onUploadProgress: (progressEvent) => {
console.log('上传进度:', progressEvent.loaded / progressEvent.total);
}
})
但进度日志完全没输出,是我漏了什么配置吗?还是得用原生 XMLHttpRequest 才行?
第一,axios的上传进度监听依赖后端支持。我之前也以为只要前端写了就能用,后来发现如果后端没正确处理Content-Length头部,progressEvent.total就会是0。你可以先用Postman测试下接口是否支持分块传输。
第二,文件要用FormData包装。直接传file对象有时会出问题,改成这样:
另外有个小坑是开发环境下如果用webpack-dev-server代理请求,有时会吞掉进度事件。可以试试直接请求后端地址排除这个问题。
如果还是不行,建议先用原生XHR验证下基础功能是否正常,我之前就是这样一步步排查出来的。
第一个,
file直接丢进去不行,得用FormData包一层。第二个,本地开发环境上传太快,进度条一闪而过你根本看不见,以为没触发。
直接复制过去试试:
如果本地测试想看清进度条效果,可以找个大点的文件,或者用 Chrome 开发者工具把网速调慢,Network 面板里有个 Throttling 选项,选 Slow 3G 就能看清进度变化了。
还有个坑,某些版本的 axios 在 Node.js 环境下不支持
onUploadProgress,但浏览器端没问题,确保你是在浏览器里跑的。