axios导出文件时二进制流处理

  • 有两种情况
  • 1.报错,返回的是一个json对象,但因为我们是以流形式请求的,所以会返回json的二进制流
  • 2.正确,返回正确的文件流
 if (Reflect.has(response.headers, 'content-disposition')) {
 //如果是二进制流,获取二进制流文件
        
 DownloadBlob(response, resolve)
       
} else {
 //如果没有导出任何东西,后台返回json,强转json,并给用户提示报错
   
  BlobToJson(response.data, resolve)
  
  }

文件流处理

function DownloadBlob({ headers, data }, resolve) {
    let downloadName
    if (headers['content-disposition'] && headers['content-disposition'].includes('attachment;filename=')) {
        downloadName = headers['content-disposition'].split('attachment;filename=')[1]
    }
    const type = headers['content-type']
    const blob = new Blob([data], { type })
    let dowloadUrl = window.URL.createObjectURL(blob)
    if (downloadName) {
        resolve({
            url: dowloadUrl,
            name: decodeURI(downloadName)
        });
    } else {
        resolve({
            url: dowloadUrl,
        });
    }
}

json处理

function BlobToJson(data, resolve) {
    let r = new FileReader()
    r.onload = function() {
        try {
            let resData = JSON.parse(this.result)
            if (resData) {
                // console.log("文件错误信息", resData);
                Vue.prototype.$message({
                    showClose: true,
                    message: resData.msg,
                    type: 'error'
                });
                resolve({
                    message: resData.message,
                    status: resData.status
                });
            }
        } catch (err) {
            // console.log("文件错误", err);
            Vue.prototype.$message({
                showClose: true,
                message: err,
                type: 'error'
            });
            resolve({
                message: err,
                status: 10030
            });
        }
    }
    r.readAsText(data)
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容