做的项目里大多是get请求,然后接口返回的data直接拼接url然后window.open打开,这次遇到的是post请求,倒也很简单,代码如下:
let exportList = async () => {
await Api.exportGoodsList(requestObj).then((res) => {
if (res.status == 200) {
//在响应头中取到content-disposition并解析为文字再正则匹配,最后作为下载的名字
let fileName = "";
let contentDisposition = decodeURI(
res.headers["content-disposition"]
);
let fileRegex = /([^(filename=')]+\.xlsx?)$/g;
fileName = contentDisposition.match(fileRegex);
//解析blob为url地址
let blob = new Blob([res.data], {
type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8",
});
url = URL.createObjectURL(blob);
let a = document.createElement("a");
a.href = url;
// 命名
a.download = fileName[0];
a.click();
window.URL.revokeObjectURL(url);
// 释放该 url
}
});
};
最后值得注意的一点是,如果下载后打不开,或者打开乱码,记得看看有没有在请求中传入带blob的请求方式
然后,还可以使用file-serve库,更加简单。