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] //分割出文件名
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐