axios配置responseType: 'blob'时,接口返回成功的数据是正常的文件流,返回失败的时候也会以文件流的形式下载到本地,但是是一个损坏的文件。
通过观察发现:有效的情况下返回的type是application/octet-stream,而失败的时候type是application/josn,那我们就根据这个条件对结果进行处理,对失败的结果转换成json,在页面给出错误提示。
处理代码如下:
正常的type为application/octet-stream时,就执行下载到本地的操作,否则页面提示
if (response.data.type === 'application/octet-stream') {
const blob = new Blob([response.data], { type: 'application/vnd.ms-excel' })
const url = window.URL.createObjectURL(blob)
const link = document.createElement('a') // 创建a标签
link.href = url
link.click()
URL.revokeObjectURL(url) // 释放内存
} else {
// 将blob文件流转换成json
const reader = new FileReader()
reader.onload = function (event) {
const message = JSON.parse(reader.result).data
_this.$errorMsg(message) // 将错误信息显示出来
}
reader.readAsText(response.data)
}
给出下载的完成代码:
axios({
method: 'GET',
url: '/logistics/orderExcel',
params, // 参数
// 参数格式转换,否则会报跨域问题!!
paramsSerializer: params => { return qs.stringify(params, { arrayFormat: 'brackets' }) },
responseType: 'blob'
}).then(response => {
if (response.data.type === 'application/octet-stream') {
const blob = new Blob([response.data], { type: 'application/vnd.ms-excel' })
const url = window.URL.createObjectURL(blob)
const link = document.createElement('a') // 创建a标签
link.href = url
link.click()
URL.revokeObjectURL(url) // 释放内存
} else {
// 将blob文件流转换成json
const reader = new FileReader()
reader.onload = function (event) {
const message = JSON.parse(reader.result).data
_this.$errorMsg(message) // 将错误信息显示出来
}
reader.readAsText(response.data)
}
}).catch(error => {
_this.$errorMsg('' + error)
})