const doDownload = ({
url,
params,
data,
method = 'GET',
type = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8',
fileName,
}: paramsType) => {
return request({
url,
method,
data,
params,
responseType: 'blob',
customConfig: { originRespone: true },
}).then((res) => {
const blob = res.data
// 通过reader 将blob转化成字符串
const reader = new FileReader()
reader.readAsText(blob, 'utf8')
reader.onload = function () {
try {
// 将字符串转成json(正常文件内容无法JSON.parse,会走catch的逻辑)
const res = JSON.parse(this.result)
if (res.code !== 200) {
ElMessage.error(res.message)
}
} catch (error) {
// 正确的情况下载文件
const blob = new Blob([res.data as any], { type })
const elink = document.createElement('a')
if ('download' in elink) {
// 非IE下载
const fileName = fileNameFromHeader(res)
if (fileName) {
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 {
// @ts-ignore
navigator.msSaveBlob(blob, fileName)
}
}
}
})
}
参考内容