<a>标签实现点击下载后端返回文件

1,350 阅读2分钟

要实现 <a> 标签点击后,访问后端接口并下载文件。

初步想法是设置<a> 标签的点击事件,点击后利用 ajaxaxios方式访问后端接口。但是如何接收并下载后端返回的二进制形式文件呢?

查了一些资料之后,了解到 blobFileReader 的概念。

blob

引用至 MDN-blob

Blob 对象表示一个不可变、原始数据的类文件对象。它的数据可以按文本或二进制的格式进行读取,也可以转换成 ReadableStream 来用于数据操作。 

Blob 表示的不一定是JavaScript原生格式的数据。File 接口基于Blob,继承了 blob 的功能并将其扩展使其支持用户系统上的文件。

要从其他非blob对象和数据构造一个 Blob,请使用 Blob() 构造函数。要创建一个 blob 数据的子集 blob,请使用 slice() 方法。要获取用户文件系统上的文件对应的 Blob 对象,请参阅 File 文档。

接受 Blob 对象的API也被列在 File 文档中。

FileReader

引用至 MDN-FileReader

FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据。

其中File对象可以是来自用户在一个<input>元素上选择文件后返回的FileList对象,也可以来自拖放操作生成的 DataTransfer对象,还可以是来自在一个HTMLCanvasElement上执行mozGetAsFile()方法后返回结果。

重要提示: FileReader仅用于以安全的方式从用户(远程)系统读取文件内容 它不能用于从文件系统中按路径名简单地读取文件。 要在JavaScript中按路径名读取文件,应使用标准Ajax解决方案进行服务器端文件读取,如果读取跨域,则使用CORS权限。

实际代码解决方式

看完上面两个介绍,接收后端二进制文件,可以用 blob 接收后端返回数据,并创建一个 FileReader 对象。 用FileReaderreadAsDataURL api,把文件转化为 url 形式。

FileReader.readAsDataURL()
开始读取指定的Blob中的内容。一旦完成,result属性中将包含一个data: URL格式的Base64字符串以表示所读取文件的内容。

当转化完毕,设计 onload 方法,创建一个临时的 <a> 标签,把数据载入这个标签,自动点击后移除。

          let blob = res.data;
          let reader = new FileReader();
          reader.readAsDataURL(blob);
          reader.onload = (e) => {
            let a = document.createElement("a");
            a.download = this.$data.point.mdName;
            a.href = e.target.result;
            document.body.appendChild(a);
            a.click();
            document.body.removeChild(a);
          };