文件流转换(一般用于axios设置接收文件流设置时responseType: 'blob')
文件流转换
一般用于axios设置接收文件流设置时responseType: 'blob'当接口报错时,前端因已设置responseType: 'blob'无法再接收json格式数据,会把json格式数据转为blob格式,而到了这里拦截器已无法识别blob进而无法对blob数据进行拦截,这个时候就需要前端将数据blob格式进行转换成正常的json的数据,这会导致前端无法显示报错信息
/**
* 文件流转换 主要代码块,可自定义下载文件名称
* @param {} data
*/
export function download(data, titName) {
var reader = new FileReader()
reader.readAsText(data, 'utf-8')
reader.onload = function() {
try {
const newRes = JSON.parse(reader.result) // 获取blob数据转换为json后的数据,即后台返回的原始数据
if (!newRes.success) {
if (newRes.code === '407') {
MessageBox.confirm(newRes.message, i18n.t('tips.confirmlogout'), {
confirmButtonText: i18n.t('btn.loginagain'),
cancelButtonText: i18n.t('btn.cancel'),
type: 'warning',
duration: 0,
showClose: true
}).then(() => {
store.dispatch('user/resetToken').then(() => {
location.reload()
})
Promise.reject()
}).catch(err => {
return Promise.reject(err)
})
} else {
Notification.error({
title: 'Server Error',
message: newRes.message,
duration: 0,
showClose: true
})
}
}
} catch (err) {
if (!data) {
return
}
const content = data
const blob = new Blob([content], { type: 'application/vnd.ms-excel' })
const fileName = titName || 'EXCEl.xls'
if ('download' in document.createElement('a')) { // 非IE下载
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) // 释放URL 对象
document.body.removeChild(elink)
} else { // IE10+下载
navigator.msSaveBlob(blob, fileName)
}
}
}
}