最近在做一个导出功能,返回值设置了responseType: Blob的方式,但又有个额外需求,就是某些情况下,无法导出时接口不会返回二进制,而是会返回报错信息。此时接口是无法正确拿到报错信息的。
这是之前封的一个下载方法:
// 通用下载方法
function download(url, params, filename,method) {
return service[method?method:'post'](url, params, {
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + getToken()
},
responseType: 'blob',
}).then((data) => {
const code = data.code || 200;
const content = data
const blob = new Blob([content])
const elink = document.createElement('a')
elink.download = filename
elink.style.display = 'none'
elink.href = URL.createObjectURL(blob)
document.body.appendChild(elink)
elink.click()
URL.revokeObjectURL(elink.href)
document.body.removeChild(elink)
}).catch((r) => {
console.error(r)
})
}
这种封装方式,正常情况下接口的返回值:
但报错情况下,接口会返回报错信息,并不是二进制:
此时封装的下载方法并不能正常抛出报错,反而会继续下载下来一个有问题的文件。
此时可以借助FileReader()对象。FileReader() 对象是js中用户读取Blob(文件对象)或者File(文件)内容的对象。
可以这样改造:
// 通用下载方法
export function download(url, params, filename,method) {
return service[method?method:'post'](url, params, {
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + getToken()
},
responseType: 'blob',
}).then((data) => {
let fileReader = new FileReader();
fileReader.onload = function() {
try {
let jsonData = JSON.parse(this.result);
if (jsonData.code) {
Message({
message: jsonData.msg,
type: 'error',
duration: 5 * 1000
})
}
} catch (err) {
const code = data.code || 200;
const content = data
const blob = new Blob([content])
const elink = document.createElement('a')
elink.download = filename
elink.style.display = 'none'
elink.href = URL.createObjectURL(blob)
document.body.appendChild(elink)
elink.click()
URL.revokeObjectURL(elink.href)
document.body.removeChild(elink)
}
};
fileReader.readAsText(data)
}).catch((r) => {
console.error(r)
})
}