axios获取后端文件流get/post下载Excel,详细步骤以及踩过的坑
axios获取后端文件流get/post下载Excel,详细步骤以及踩过的坑
·
1、先说get的方法,比较简单,直接超链接跳转即可:
const action=url+`/modelTemplate/exportExcel/${Id}` //完整的接口地址
window.open(action, '_self'); // _self参数设置是为了不跳转到新界面上去
2、post方法:
const config={
responseType: 'blob' //这个一定要设置,否则会出现文件下载后打不开的情况
}
axios.post(url,params,config).then(res=>{
let blob=new Blob([res],{ //设置数据源
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; application/octet-stream' //设置文件格式
})
let objectUrl = URL.createObjectURL(blob); //创建下载的链接
let a = document.createElement("a");
a.href = objectUrl;
a.download = ‘fileName’; //设置文件名
//下面这个写法兼容火狐
a.dispatchEvent(new MouseEvent('click', {bubbles: true, cancelable: true, view: window}));
window.URL.revokeObjectURL(blob); //释放bolb对象
})
这里如果有对文件名的要求,一般都返回在响应头的’content-disposition’下:
不过这里有两个坑
1、出现无法获取响应header的Content-Disposition字段的情况:
在控制台明明能看到,但是在响应拦截器里用 headers[“content-disposition”]来获取,但是打印 header对象里并没有content-disposition,无法获取。
这是因为默认情况下,content-disposition不会暴露给外部,解决办法就是后端服务器不仅要在header里加入该首部,还要将它们在 Access-Control-Expose-Headers 里面列出来:
设置成功后,就可以看到了:
2、一般来说直接在接口调用成功后的res.header里获取content-disposition,但是如果后端返回给你的直接是一个完完全全的文件流,也就是这样:
那么就需要我们手动获取response里的Header信息了:
let req = new XMLHttpRequest();
const action=url+`/modelTemplate/exportExcel/${Id}` //完整的接口地址
req.open('GET', action, false);
req.send(null);
let headers = req.getAllResponseHeaders()
console.log(headers);
// 由于返回的是用\r\n来进行分割的字符串,需要做转换
let arr = headers.trim().split(/[\r\n]+/);
let headerMap = {};
arr.forEach(function (line) {
let parts = line.split(': ')
let header = parts.shift()
let value = parts.join(': ')
headerMap[header] = value
})
let contentDisposition = headerMap['content-disposition'];//获取content-disposition信息
let fileName=contentDisposition.split('fileName=')[1] //分割出文件名
更多推荐
已为社区贡献2条内容
所有评论(0)