axios封装上传进度返回进度
axios是一个基于Promise的HTTP客户端,可以用于浏览器和Node.js中发送HTTP请求。在前端开发中,经常需要上传文件或者提交表单数据,而axios提供了一个非常方便的方式来完成这些操作。
本文将介绍如何通过封装axios来实现上传进度的返回,并通过代码示例来演示具体的实现步骤。
封装axios
首先,我们需要封装一个自定义的axios实例,以便于在请求中添加进度事件的监听器。我们可以通过axios的create
方法来创建一个自定义的axios实例。
// fileUpload.js
import axios from 'axios';
const fileUpload = axios.create();
export default fileUpload;
在封装的axios实例中,我们可以添加一些自定义的请求拦截器和响应拦截器,以便于处理请求和响应的逻辑。
监听上传进度
在文件上传过程中,我们可以通过监听XMLHttpRequest对象的progress
事件来获取上传进度。在封装的axios实例中,我们可以使用axios的interceptors.request
方法来添加请求拦截器,从而在发送请求之前添加进度事件的监听器。
// fileUpload.js
// ...
fileUpload.interceptors.request.use(config => {
if (config.onUploadProgress) {
const { onUploadProgress } = config;
config.onUploadProgress = progressEvent => {
const percent = Math.round((progressEvent.loaded * 100) / progressEvent.total);
onUploadProgress(percent);
};
}
return config;
}, error => {
return Promise.reject(error);
});
// ...
在上述代码中,我们首先判断config
中是否传入了onUploadProgress
回调函数,如果有,则在config.onUploadProgress
中添加进度事件的监听器。在监听器中,我们计算上传进度的百分比,并将其作为参数传递给onUploadProgress
回调函数。
使用自定义axios实例上传文件
使用我们封装的axios实例来上传文件非常简单。我们只需要在发送请求时,将onUploadProgress
回调函数作为配置项传递给axios即可。
// App.js
import React from 'react';
import fileUpload from './fileUpload';
const uploadFile = file => {
const formData = new FormData();
formData.append('file', file);
return fileUpload.post('/upload', formData, {
onUploadProgress: percent => {
console.log(`上传进度:${percent}%`);
}
});
};
const App = () => {
const handleFileChange = e => {
const file = e.target.files[0];
uploadFile(file)
.then(response => {
console.log(response.data);
})
.catch(error => {
console.error(error);
});
};
return (
<div>
<input type="file" onChange={handleFileChange} />
</div>
);
};
export default App;
在上述代码中,我们定义了一个uploadFile
函数来上传文件。在发送请求时,我们将onUploadProgress
回调函数传递给axios的配置项中,并在控制台打印上传进度。
甘特图
下面是一个使用mermaid语法绘制的上传进度的甘特图。
gantt
title 上传进度
section 上传
上传文件: 2022-01-01, 3d
处理上传: 2022-01-04, 2d
上传完成: 2022-01-06, 1d
以上是关于axios封装上传进度返回进度的科普文章。通过封装axios并添加进度事件的监听器,我们可以轻松实现文件上传进度的返回。希望本文对你有所帮助!