接口返回二进制文件流前端处理方法

前后端分离项目中,为保证数据安全性,文件数据通常使用接口调用方式获取,后端返回二进制文件流后前端该如何处理。

流数据转链接
获取到的流文件数据(注意:接口调用时需设置responseType:blob)使用Blob构造函数(将二进制数据存储为一个单一个体的集合)进行转换,它接受两个参数。第一个参数是数组,成员是字符串或二进制对象,表示新生成的Blob实例对象的内容;第二个参数是可选的,是一个配置对象。然后通过URL.createObjectURL()方法会根据传入的参数创建一个指向该参数对象的URL.最后返回一个以blob://xxx的浏览器临时路径地址

	//(例)将pdf流文件数据转为临时链接地址
	let blob = new Blob([res.data],{type:'application/pdf'}
	const url = URL.createObjectURL(blob)

对于不同类型文件转换通过改变type的值实现

文件类型分类

常见文件场景有图片、视频、音频、word、excel、pdf这些类别

文件类型(扩展名)type类型
.jpeg .jpgimage/jpeg
.mp3audio/mpeg
.pdfapplication/pdf
.xlsapplication/vnd.ms-excel
.docapplication/msword
.pdfapplication/pdf
.mpeg .mp4video/mpeg

非流文件处理
正常情况下会返回流文件前端进行转换,在错误情况下返回报错(json)信息时,这时我们不需要下载文件而是给出错误信息.
接口返回的报错信息是json格式,由于请求设置了responseType:‘blob’,所以会转化为Blob类型.
这时需要使用FileReader读取文件,具体逻辑代码如下

//downAllTask为封装的接口方法,params为请求参数
downAllTask(params).then((res) => {
	//实例读取文件对象
    const r = new FileReader();
    r.onload = function () {
    try {
    	// this.result为FileReader获取blob数据,如果返回报错信息,则是正确的json数据,JSON.parse会正常转换
    	//如果返回文件流,则JSON.parse时会报错,走catch代码块(进行正常的文件下载)   	
        const resData = JSON.parse(this.result); 
        //resData是后端返回的json数据
        if (resData.errorcode===500) {
           proxy.$message.warning(resData.msg)
           return
        }
     }catch (error) {
         let blob = new Blob([res], { type: "application/zip" });
         let url = window.URL.createObjectURL(blob);
         const link = document.createElement("a"); 
         link.href = url;
         link.download = "下载图片"; 
         link.click();
         URL.revokeObjectURL(url);
      }
    }
    r.readAsText(res)
}).catch((e)=>{
})

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐