Vue3 + axios + vue-vben-admin 实现单文件上传功能
场景
最近一段时间使用 vue-vben-admin 上传单文件中,用人家自定义的 uploadFile 出现了 process 未知问题,导致流程直接中断,时间紧迫,索性自己用 axios 封装了个。
代码在对应位置都加了注释,方便不同阶段道友查看,大神可直接路过
上代码
// src/utils/http/axios/upload.js
/**
* @author zxn
* @description axios 上传单文件
* @param {object.url} - 请求接口
* @param {object.method} - 请求方法
* @param {object.file} - 上传的文件
* @param {object.extraParams} - 上传附加参数
* @param {object.fileName} - 上传的文件名称
* @param {object.config} - axios 其他配置
*/
import axios from 'axios';
import { getToken } from '/@/utils/auth'; // 获取 token
import { useMessage } from '/@/hooks/web/useMessage'; // 引入提示框
const { createMessage } = useMessage(); // 引入 message 提示
const token = getToken();
let headers = { 'Content-Type': 'multipart/form-data', Authorization: token }; // 请求头设置
// 因为整块文件只有一个导出,所以使用默认导出功能,并使用 ES6 对参数进行默认赋值,不懂的小伙伴可看[阮大大的教程](https://es6.ruanyifeng.com/#docs/destructuring)
export default function ({
url,
method = 'POST',
file,
extraParams = {},
fileName = 'file',
config
} = {}) {
// 创建 FormData 对象,并通过 append() 方法添加参数
const fd = new FormData();
fd.append(fileName, file);
// 这里对附加参数进行统一处理,全部添加到 FormData 对象内
Object.keys(extraParams).length &&
Object.keys(extraParams).forEach(key => {
if (Array.isArray(extraParams[key])) {
extraParams[key].forEach(item => {
fd.append(`${key}[]`, item);
});
return;
}
fd.append(key, extraParams[key]);
});
// 这里使用 Promise 对象,方便链式调用
return new Promise((resolve, reject) => {
axios
.request({
url,
method,
data: fd,
headers,
...config
})
.then(({ data }) => {
const { code, message } = data;
if (code != 200) {
createMessage.error(message);
reject(new Error(message));
}
resolve(data);
})
.catch(error => {
reject(new Error(error));
});
});
}