天天看点

axios responseType: ‘blob‘下载文件,失败时转换成json

axios配置responseType: 'blob'时,接口返回成功的数据是正常的文件流,返回失败的时候也会以文件流的形式下载到本地,但是是一个损坏的文件。

通过观察发现:有效的情况下返回的type是application/octet-stream,而失败的时候type是application/josn,那我们就根据这个条件对结果进行处理,对失败的结果转换成json,在页面给出错误提示。

axios responseType: ‘blob‘下载文件,失败时转换成json

处理代码如下:

正常的type为application/octet-stream时,就执行下载到本地的操作,否则页面提示 

if (response.data.type === 'application/octet-stream') {
          const blob = new Blob([response.data], { type: 'application/vnd.ms-excel' })
          const url = window.URL.createObjectURL(blob)
          const link = document.createElement('a') // 创建a标签
          link.href = url
          link.click()
          URL.revokeObjectURL(url) // 释放内存
        } else {
          // 将blob文件流转换成json
          const reader = new FileReader()
          reader.onload = function (event) {
            const message = JSON.parse(reader.result).data
            _this.$errorMsg(message) // 将错误信息显示出来
          }
          reader.readAsText(response.data)
        }
           

 给出下载的完成代码:

axios({
        method: 'GET',
        url: '/logistics/orderExcel',
        params, // 参数
        // 参数格式转换,否则会报跨域问题!!
        paramsSerializer: params => { return qs.stringify(params, { arrayFormat: 'brackets' }) },
        responseType: 'blob'
      }).then(response => {
        if (response.data.type === 'application/octet-stream') {
          const blob = new Blob([response.data], { type: 'application/vnd.ms-excel' })
          const url = window.URL.createObjectURL(blob)
          const link = document.createElement('a') // 创建a标签
          link.href = url
          link.click()
          URL.revokeObjectURL(url) // 释放内存
        } else {
          // 将blob文件流转换成json
          const reader = new FileReader()
          reader.onload = function (event) {
            const message = JSON.parse(reader.result).data
            _this.$errorMsg(message) // 将错误信息显示出来
          }
          reader.readAsText(response.data)
        }
      }).catch(error => {
        _this.$errorMsg('' + error)
      })