前端实现文件下载


文件下载方法+踩坑实录

文件下载思路:后端传给前端一个二进制流文件,前端将它封装成blob类型,然后调用接口进行文件下载。

接口配置(踩坑)

首先要知道post后面第一个参数是url,第二个参数是body,第三个参数是config

我们使用axios进行接口的封装(如何封装这里就不说了,有需要的可以联系博主)

对于下载功能的接口,电子所的项目是这样的:

(因为后端的要求所以把dataId,productType拼接到url中调用接口。实际情况还是要根据自己的项目实际来配置接口)

可以看到在url后面有一个空的 {},这个空的{}非常的关键!!!。

因为我们是使用blob的方式调用接口获得路径然后下载,所以需要在接口处添加responseType: 'blob',不然下载的文件会出现损坏。

并且(划重点),如果你把空的{}去掉了,你下载的文件也会出现损坏,因为axios会默认把{responseType: ‘blob’}当成request body进行封装,而不是config。very important!!!

  getDetailDownload(dataId, productType){
    return http.post(`/retrieval/system/data/download/?dataId=${dataId}&productType=${productType}`, {},
    {responseType: 'blob'});
  },

File-Saver文件下载

先给个file-saver的文档:戳这里

安装File-saver

npm命令安装:npm install file-saver -s

在需要的module中引入:import saveAs from 'file-saver';

File-saver的使用

    detailDownload(detail) {
      apiService.getDetailDownload(detail.id, detail.productType)
      .then((href) => {
        const blob = new Blob([href.data], {type: href.header['content-type']});
        const fileName = href.header['content-disposition'].split(";")[1].split("filename=")[1];
        saveAs(blob, fileName);
      }).catch(() => {
      });
    },
    //因为需要拿到文件名字,和后端商量好将文件名放在content-disposition暴露给前端

就是这么简单!

通过a标签进行文件下载

原理也是封装blob类型对象。调用URL.createObjectURL 方法生成a标签的url实现点击a标签进行下载

    detailDownload(detail) {
      apiService.getDetailDownload(detail.id, detail.productType)
      .then((href) => {
        const blob = new Blob([href.data], {type: href.header['content-type']});
        const fileName = href.header['content-disposition'].split(";")[1].split("filename=")[1];
        const url = window.URL.createObjectURL(blob);
        const link = document.createElement('a');
        link.download = fileName;
        link.href = url;
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
      }).catch(() => {
      });
    },

一对比就能感觉到file-saver更好用嘛!


文章作者: Silong Xu
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Silong Xu !
 上一篇
前端添加视频的方法 前端添加视频的方法
前端添加视频的方法-video.js 纯video.js 下载与引用 首先下载并引用video.js: CDN方法 略 (引用的时候js和css文件都要引用) npm方法: npm install video.js 简单的使用 引用之后直
2020-10-19
下一篇 
VUEX使用方法 VUEX使用方法
VUEX的使用 官网文档 看这里 只能通过在mutation,getter,action中写逻辑来改变state中的数据。并且不能直接通过 = 来实现,需要使用 vue 中的 set delete方法 mutation只能写同步方法,异步都
2020-10-19
  目录