axios请求下载导出一个文件,请求成功时返回的是一个流形式的文件,需要设置responseType: 'arraybuffer',但是请求失败的时候返回的是json ,需要用默认的responseType: 'json'来处理错误信息,那么问题来了,我该怎么根据服务器响应后才设置这个responseType?
axios请求下载导出一个文件,请求成功时返回的是一个流形式的文件,需要设置responseType: 'arraybuffer',但是请求失败的时候返回的是json ,需要用默认的responseType: 'json'来处理错误信息,那么问题来了,我该怎么根据服务器响应后才设置这个responseType?
我们不需要根据服务器返回的情况去随机设置responseType
一、我们要明白,我们在请求下载文件的api时候,可能给我们的返回值有两种情况:
二、理解responseType
axios中这样描述的:responseType`表示服务器响应的数据类型,可以是 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream'
不过我经常用blob,其实用什么都无所谓,主要看在拿到返回值的时候如何处理。
三、处理返回值的不同情况
const API = axios.create({
baseURL: API_HOST
})
API({
method: 'get',
url: file.url,
responseType: 'blob'
}).then(response => {
const type = response.type || null
//relType你所下载的文件类型,这里是xlsx
const relType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
if (type.includes(relType)) {
/**做文件下载 */
return
}
if (type.includes('application/json')) {
let reader = new FileReader()
reader.onload = e => {
if (e.target.readyState === 2) {
let res = {}
res = JSON.parse(e.target.result)
console.info('back:: ', res)
}
}
reader.readAsText(response)
}
})
根据response.type返回内容的MIME TYPE 来判断是要下载文件,还是要去做一些JSON数据提示什么的操作。如果是JSON类型那就把Blob通过readAsText转为JSON格式。这种方式通过测试IE10和IE10以上版本。
作者可以尝试在arrayBuffer的情况下使用arrayBuffer to Json来进行信息提示。
一下优先级由低到高
})
刚刚解决了这个问题,现在回答一下,下面是项目中的代码
// Blob 不处理
if (response.data instanceof Blob) {
const relType = ['application/pdf']
if (!relType.includes(response.data.type)) {
let reader = new FileReader()
reader.onload = e => {
// @ts-ignore
if (e.target.readyState === 2) {
let result: any = {}
// @ts-ignore
result = JSON.parse(e.target.result)
Message.error(result.message || 'Error')
}
}
reader.readAsText(response.data)
return Promise.reject('Error')
}
return response
}
8 回答4.6k 阅读✓ 已解决
6 回答3.2k 阅读✓ 已解决
5 回答2.7k 阅读✓ 已解决
5 回答6.2k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
3 回答2.4k 阅读
4 回答2.8k 阅读✓ 已解决
请求设置了responseType: 'arraybuffer',
请求成功时,下载文件
请求失败时,后端返回json对象,如:{"msg":"系统异常","code":1,"success":false},也被转成了arraybuffer
我的解决方案是,失败时,将数据arraybuffer转成Json对象就好了。
举个例: