结果返回说明
参数或异常时后端返回异常JSON,用于提示:
{
code: 500
data: null
message: "*****"
success: false
}
参数正常时后端返回二进制流,用于文件导出:
Axios封装及问题
axios封装导出时, 需设置responseType: ‘blob’,导致接口返回值读取reponse时为blob,无法直接读取到code、messge等JSON信息;取消responseType: ‘blob’则会影响正常下载。
解决方案
将blob的内容转成文件读取,根据response.data里的type去判断返回的类型。
显示报错信息时处理:
if (res.data.type == 'application/json') {
const reader = new FileReader(); // 创建一个FileReader实例
reader.readAsText(res.data, 'utf-8'); // 读取文件,结果用字符串形式表示
reader.onload = function () { // 读取完成后,获取reader.result
const data = JSON.parse(reader.result);
if (data.code != 200) {
errorMsg(data.message || '导出失败')
}
}
}
作为excel导出时处理:
// 解析请求头,获取文件名
const fileName = res.headers["content-disposition"].split("=")[1];
const blob = new Blob([res.data], {
type:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"
});
const url = window.URL.createObjectURL(blob);
const aLink = document.createElement("a");
aLink.style.display = "none";
aLink.href = url;
aLink.setAttribute("download", decodeURI(fileName));
document.body.appendChild(aLink);
aLink.click();
document.body.removeChild(aLink); // 下载完成移除元素
window.URL.revokeObjectURL(url); // 释放掉blob对象
完整代码如下
此处封装成独立方法
export function exportExcleUtil(res) {
if (res.data.type == 'application/json') {
const reader = new FileReader(); // 创建一个FileReader实例
reader.readAsText(res.data, 'utf-8'); // 读取文件,结果用字符串形式表示
reader.onload = function () { // 读取完成后,获取reader.result
const data = JSON.parse(reader.result);
if (data.code != 200) {
errorMsg(data.message || '导出失败')
}
}
} else {
// 解析请求头,获取文件名
const fileName = res.headers["content-disposition"].split("=")[1];
const blob = new Blob([res.data], {
type:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"
});
const url = window.URL.createObjectURL(blob);
const aLink = document.createElement("a");
aLink.style.display = "none";
aLink.href = url;
aLink.setAttribute("download", decodeURI(fileName));
document.body.appendChild(aLink);
aLink.click();
document.body.removeChild(aLink); //下载完成移除元素
window.URL.revokeObjectURL(url); //释放掉blob对象
}
}