返回Blob对象的导出类接口,如何在报错时展示报错信息

最近在做一个导出功能,返回值设置了responseType: Blob的方式,但又有个额外需求,就是某些情况下,无法导出时接口不会返回二进制,而是会返回报错信息。此时接口是无法正确拿到报错信息的。

这是之前封的一个下载方法:

// 通用下载方法
function download(url, params, filename,method) {
  return service[method?method:'post'](url, params, {
    headers: {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ' + getToken() 
    },
    responseType: 'blob',
  }).then((data) => {
        const code = data.code || 200;
        const content = data
        const blob = new Blob([content])
        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)
        document.body.removeChild(elink)        
  }).catch((r) => {
    console.error(r)
  })
}

这种封装方式,正常情况下接口的返回值:

但报错情况下,接口会返回报错信息,并不是二进制:

此时封装的下载方法并不能正常抛出报错,反而会继续下载下来一个有问题的文件。

此时可以借助FileReader()对象。FileReader() 对象是js中用户读取Blob(文件对象)或者File(文件)内容的对象。

可以这样改造:

// 通用下载方法
export function download(url, params, filename,method) {
  return service[method?method:'post'](url, params, {
    headers: {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ' + getToken() 
    },
    responseType: 'blob',
  }).then((data) => {
    let fileReader = new FileReader();
    fileReader.onload = function() {
      try {
        let jsonData = JSON.parse(this.result); 
        if (jsonData.code) {
          Message({
            message: jsonData.msg,
            type: 'error',
            duration: 5 * 1000
          })
        }
      } catch (err) {   
        const code = data.code || 200;
        const content = data
        const blob = new Blob([content])
        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)
        document.body.removeChild(elink)
      }          
    };         
    fileReader.readAsText(data)
  }).catch((r) => {
    console.error(r)
  })
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值