- 有两种情况
- 1.报错,返回的是一个json对象,但因为我们是以流形式请求的,所以会返回json的二进制流
- 2.正确,返回正确的文件流
if (Reflect.has(response.headers, 'content-disposition')) {
//如果是二进制流,获取二进制流文件
DownloadBlob(response, resolve)
} else {
//如果没有导出任何东西,后台返回json,强转json,并给用户提示报错
BlobToJson(response.data, resolve)
}
文件流处理
function DownloadBlob({ headers, data }, resolve) {
let downloadName
if (headers['content-disposition'] && headers['content-disposition'].includes('attachment;filename=')) {
downloadName = headers['content-disposition'].split('attachment;filename=')[1]
}
const type = headers['content-type']
const blob = new Blob([data], { type })
let dowloadUrl = window.URL.createObjectURL(blob)
if (downloadName) {
resolve({
url: dowloadUrl,
name: decodeURI(downloadName)
});
} else {
resolve({
url: dowloadUrl,
});
}
}
json处理
function BlobToJson(data, resolve) {
let r = new FileReader()
r.onload = function() {
try {
let resData = JSON.parse(this.result)
if (resData) {
// console.log("文件错误信息", resData);
Vue.prototype.$message({
showClose: true,
message: resData.msg,
type: 'error'
});
resolve({
message: resData.message,
status: resData.status
});
}
} catch (err) {
// console.log("文件错误", err);
Vue.prototype.$message({
showClose: true,
message: err,
type: 'error'
});
resolve({
message: err,
status: 10030
});
}
}
r.readAsText(data)
}