在项目中遇到一个需求,须要导出文件,以往的作法是使用location.href跳转,剩下的就直接交给后端就行了,但由于认证方式使用的是jwt,因此须要在请求的时候添加自定义http请求头,传统的方式再也不适用。javascript
responseType: 'arraybuffer'
复制代码
指定返回值类型java
将返回的二进制数据转为Bolb对象ios
将bolb对象转为 DataURLaxios
利用a标签下载文件后端
废话很少说直接上代码bash
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);
};
});
复制代码