接收文件流并导出至excel以及对二进制文件流内容的校验
废话不说 上代码
const handleRightDownload = async () => {
axios({
method: 'post',
url: '/my/handleAndDownloadExcel', // 请求地址 这里写后端的地址,注意加上`/api`以确保最终的请求能被替换掉 ,/api表示server要替换的前缀 '/api' -> ''
data: {
fileid:my.id //额外参数
},
headers: {
// 请求头
Authorization: `Bearer ${token}`, // 这里要加上token防止401无权限
'Content-Type': 'application/json;charset=utf-8'
},
responseType: 'blob' // 表明返回服务器返回的数据类型,关键代码,不加则会返回json格式
}).then(async (res) => {
console.log('res :>> ', res)
console.log(' res.data :>> ', res.data)
const blob = new Blob([res.data], {
type: res.headers['content-type']
})
const reader = new FileReader()
//此if语句为了判断返回的二进制对象是不是正常的文件流形式, 如果后端返回的是{code:-1,msg:`模板错误` }诸如此类则会在这里被捕获到,也就没必要走下去了
if (blob.type.indexOf('application/json') > -1) {
reader.readAsText(blob)
reader.onload = (e) => {
let text = e.target.result
if (typeof text == 'string') {
var errInfo = JSON.parse(text)
MessagePlugin.error({
content: errInfo.msg,
duration: 2000
})
}
}
return
}
// 正常态,则开始本地下载流程
const newBlob = res.data
reader.readAsDataURL(newBlob) // 转换为base64,可以直接放入a标签href
reader.onload = function (e) {
var a = document.createElement('a') // 转换完成,创建一个a标签用于下载
a.download = `${currentFileName.value}.xlsx`
a.href = e.target.result
document.body.appendChild(a)
a.click()
a.remove()
}
MessagePlugin.success(`文件:${currentFileName.value}.xlsx导出成功`)
})
//
}