前端点击按钮导出Excel表,以下方法,前提是让后端返回的文件流可以直接请求下载。
意思就是:你通过在浏览器请求接口,传参就可以直接下载文件。
方法一:
window.open('请求地址')
适用于get请求,需要传参的话,直接在地址后面拼接参数即可
此方法的缺点:逻辑是重新打开一个新的页面发请求,因此请求时间较长时会出现空白页。
方法二:
const link = document.createElement("a");
link.href='请求地址';
link.download='文件名.xlsx';
link.click();//点击事件
适用于get请求,需要传参的话,直接在地址后面拼接参数即可
该方法逻辑是用a标签发送请求。在当前页面发送请求,不会出现空白页。
方法三:
const data = {
name:'张三'
};//请求参数写这里面
var oReq = new XMLHttpRequest();
oReq.open("POST", '请求地址', true);
oReq.responseType = "blob";
oReq.setRequestHeader("Content-Type", "application/json");
oReq.send(JSON.stringify(data))
oReq.onload = function (oEvent) {
var content = oReq.response;
var elink = document.createElement('a');
elink.download = '文件名.xlsx'
elink.style.display = 'none';
var blob = new Blob([content]);
elink.href = URL.createObjectURL(blob);
document.body.appendChild(elink);
elink.click();
document.body.removeChild(elink);
此方法是用原生ajax发送请求。
需要注意,请求头的配置。如果项目是用的存储在cookie里面的值去验证用户身份的话,建议不要用这个方法,因为我试了行不通。但是用的localStorage或者sessionStorage存储token验证身份就可以。
本人试了多次,不能用封装好的ajax发请求,猜想大概原因是封装好了的ajax响应拦截器那里会做一些操作,所以不能正常请求下载文件。以上方法就是为了不通过响应拦截器实现获取后端返回的文件流。不知道响应拦截器那里应该怎么配置让文件通过,顺利下载。如果您有想法,请在评论区指导一下,谢谢。