axios使用post方式添加自定义请求头实现文件导出
在项目中遇到一个需求,需要导出文件,以往的做法是使用location.href跳转,剩下的就直接交给后端就好了,但因为认证方式使用的是jwt,所以需要在请求的时候添加自定义http请求头,传统的方式不再适用。
- 实现逻辑详解,axios,在发起请求是添加配置项
responseType: 'arraybuffer'
指定返回值类型
-
将返回的二进制数据转为Bolb对象
-
将bolb对象转为 DataURL
-
利用a标签下载文件
废话不多说直接上代码
const requestUse = (config) => {
if (!config) {
// eslint-disable-next-line
config = {
headers: {
Authorization: getToken(),
},
};
} else if (config.isLogin) {
return config;
} else if (!config.headers.Authorization) {
config.headers.Authorization = getToken();
}
return config;
};
request = axios.create({
baseURL: '',
});
request.interceptors.request.use(requestUse);
request.get(url, { params, responseType: 'arraybuffer', }).then((resp) => {
const disposition = resp.headers['content-disposition'];
const fileName = decodeURI(disposition.substring(disposition.indexOf('fileName=') + 9, disposition.length));
let blob;
if (navigator.msSaveBlob){
// IE 10+
blob = navigator.msSaveBlob(new Blob([resp.data], { type: resp.headers['content-type'] }), fileName);
} else {
blob = new Blob([resp.data], { type: resp.headers['content-type'] });
}
console.log(resp, blob);
const reader = new FileReader();
reader.readAsDataURL(blob);
reader.onload = (e) => {
const a = document.createElement('a');
a.download = fileName;
// 后端设置的文件名称在res.headers的 "content-disposition": "form-data; name=\"attachment\"; filename=\"20181211191944.zip\"",
a.href = e.target.result;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
};
});
axios|post|导出文件||平易在线