Blob格式转json格式,拿到后端返回的json数据
在进行文件下载的时候,我们通过blob,进行下载文件,需要axios设置responseType
responseType: 'blob',
axios({
...xxx,
responseType: 'blob',
}).then(res => {
if (!res || !res.headers['content-disposition']) {
if (res && res.status === 200 && res.data) {
//转换步骤
const file = new FileReader();
file.readAsText(res.data, 'utf-8');
file.onload = function () {
const obj = JSON.parse(file.result);
console.log(obj, 'obj')
if (obj.code === '10000') {
message.error(obj.message || '下载失败!')
}
return obj;//此时message为转化好的json格式
}
return false
} else {
message.error(res.message || '下载失败!')
return
}
}
if (res && res.status === 200 && res.data) {
const {
data, headers } = res
let fileName
if (headers['content-disposition']) {
fileName = headers['content-disposition'].replace(/\w+;filename=(.*)/, '$1')
} else {
fileName = data.fileName
}
// 此处当返回json文件时需要先对data进行JSON.stringify处理,其他类型文件不用做处理
const blob = new Blob([data], {
type: headers['content-type'] })
const dom = document.createElement('a')
const downUrl = window.URL.createObjectURL(blob)
dom.href = downUrl
dom.download = decodeURIComponent(fileName)
dom.style.display = 'none'
document.body.appendChild(dom)
dom.click()
dom.parentNode.removeChild(dom)
window.URL.revokeObjectURL(url)
return res
}
message.error(res.message || '下载失败!')
})
.catch(err => {
// error(err || '下载失败!')
console.log('下载失败')
})
但是有时候文件过大或者其他原因,后端不让我们下载,会直接返回json,这就恶心,明明要接受blob,又给我个json,
所以就需要进行判断然后转换blob,然后提醒:
正常情况下:
非正常情况:
我们需要接收到后转成json:
//转换步骤
const file = new FileReader();
file.readAsText(res.data, 'utf-8');
file.onload = function () {
const obj = JSON.parse(file.result);
console.log(obj, 'obj')
if (obj.code === '10000') {
message.error(obj.message || '下载失败!')
}
return obj;//此时message为转化好的json格式
}
file.onload方法会自动执行,所以直接在这个里面增加提醒就行。嗯,就这样。