废话不多说直接上代码
const options: AxiosRequestConfig = {
baseURL: import.meta.env.VITE_APP_PROXY_URL,
timeout: 100000,
withCredentials: true,
};
const axiosInstance = axios.create(options);
axiosInstance.interceptors.response.use(
resp => {
if (resp.request.responseType === 'blob' || resp.request.responseType === 'arraybuffer') {
if (resp.data.type === 'application/json') {
const reader = new FileReader();
reader.onload = () => {
if (reader.result) {
const res = JSON.parse(reader.result as string);
if (![0, 200].includes(res.code)) {
throw Error(resp.data);
}
}
};
reader.readAsText(resp.data);
throw Error(resp.data);
} else {
if (resp.headers['content-type'] === 'image/gif') {
return resp.data;
}
let fileName = 'file.xlsx'
const contentDisposition = resp.headers['content-disposition'];
if (contentDisposition.indexOf('filename') !== -1) {
const encoded = contentDisposition.split(';')[1].split('=')[1]
fileName = decodeURIComponent(encoded);
}
downloadFile(resp.data, fileName)
}
} else {
if (resp.config.notDealWithData) {
return resp;
}
if (![0, 200].includes(resp.data.code) || (!resp.data.success && resp.status !== 200)) {
throw Error(resp.data);
}
return resp.data;
}
},
error => {
if (error?.config?.notDealWithError) {
return Promise.reject(error);
}
return Promise.reject(error);
}
);
const downloadFile = (file: Blob, fileName = 'file.xlsx') => {
if (file) {
const blob = new Blob([file]);
const downloadElement = document.createElement('a');
const href = window.URL.createObjectURL(blob);
downloadElement.href = href;
downloadElement.download = fileName;
document.body.appendChild(downloadElement);
downloadElement.click();
document.body.removeChild(downloadElement);
window.URL.revokeObjectURL(href);
}
};