这个bug太太太太,磨人了 ,从昨天下午找到今天下午!!!吐血了
直入正题:
后台返回是这样的:看图 ↓
我的导出代码是这样的:
export function exportExcel(url, params = {}) {
return new Promise((resolve, reject) => {
axios({
method: "get",
url: url, // 请求地址
params,
responseType: "blob" // 表明返回服务器返回的数据类型
}).then(
(response) => {
resolve(response);
console.log(response)
let blob = new Blob([response], {
type: "application/vnd.ms-excel"
});
console.log(blob);
let fileName = "导出单据" + Date.parse(new Date()) + ".xls";
if (window.navigator.msSaveOrOpenBlob) {
navigator.msSaveBlob(blob, fileName);
} else {
let link = document.createElement("a");
link.href = window.URL.createObjectURL(blob);
link.download = fileName;
link.click();
// 释放内存
window.URL.revokeObjectURL(link.href);
}
},
(err) => {
reject(err);
}
);
});
}
确认过眼神,这是没有问题的! 但是导出下载后打开是这样的:↓
然后我找啊找,找了很久,网上方法都尝试了。最后看到网上有盆友说可能是使用了mock模拟的原因,我就把mock的使用关掉了(没有设置开关的盆友就可以在引入的位置注释)。
就成功导出了。。。。。踩坑太累了。。。。
额,更新一下,看了下我的代码,发现一点问题:
当responseType设置为‘blob’的时候,后台返回就是blob对象了,前端 不用 再去new Blob 了,下面就是打印的返回结果:
所以拿到结果就可以直接用了,从新修改代码:
export function exportExcel(url, params = {}) {
return new Promise((resolve, reject) => {
axios({
method: "get",
url: url, // 请求地址
params,
responseType: "blob" // 表明返回服务器返回的数据类型
}).then(
(response) => {
resolve(response);
console.log(response)
// 前面responseType设置的 “blob” 后台返回的response直接就是 blob对象,前端不用再去new Blob了
// let blob = new Blob([response], {
// type: "application/vnd.ms-excel"
// });
// console.log(blob);
let fileName = "导出单据" + Date.parse(new Date()) + ".xls";
if (window.navigator.msSaveOrOpenBlob) {
navigator.msSaveBlob(response, fileName);
} else {
let link = document.createElement("a");
link.href = window.URL.createObjectURL(response);
link.download = fileName;
link.click();
// 释放内存
window.URL.revokeObjectURL(link.href);
}
},
(err) => {
reject(err);
}
);
});
}
版权声明:本文为qq_38804584原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。