文件下载方式

57 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情

文件下载方式有哪些?

我平时在开发过程中用地比较多的主要有下面这几种
1、在a标签上加href属性
2、js中打开文件路径
3、使用iframe下载
4、动态创建a标签进行下载(angular)
5、动态创建a标签进行下载(js)

1、在a标签上加href属性

这是HTML5的新特性,在后面的4、5方法中也有用到,代码如下:

<a href="要下载文件的路径"  download="要下载文件的名称"></a>

2、js中打开文件路径

代码如下:

window.open('文件路径');<br>
或  window.location.href = '文件路径';

上面说到的两种方法在批量下载时循环不可用,再循环中只执行循环的最后一次操作。为了实现一次下载多个文件,可以使用iframe下载

3、使用iframe下载

思路:动态创建iframe,设置display和height属性,防止影响页面,然后把iframe挂载到dom树上发请求,设置定时器,5分钟后删除iframe。
代码如下:

download(item, url) {
  const iframe = document.createElement("iframe");
  iframe.style.display = "none"; // 防止影响页面
  iframe.style.height = '0px'; // 防止影响页面
  iframe.src = url+'?downloadUrl='+item.fileUrl+'&fileName='+item.fileName;
  document.body.appendChild(iframe); // 这一行必须,iframe挂在到dom树上才会发请求
  // 5分钟之后删除(onload方法对于下载链接不起作用)
  setTimeout(()=>{
    iframe.remove();
  }, 5 * 60 * 1000);
}

this.selectFiles.forEach(it => {
  that.download(it, url);
})

4、动态创建a标签进行下载(angular)

思路:获取文件流,将文件流转为可用的下载地址,通过动态创建a标签,将生成的下载地址赋值给a标签的href属性上,模拟点击事件,实现文件下载,下载后记得删除创建的a标签。
代码如下:

download() {
    let url = `路径`;
    this.http.request('GET',url,{
        responseType: "arraybuffer"
    }).subscribe((val:any)=>{
        let blob = new Blob([val], {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"});
        let objectUrl = URL.createObjectURL(blob);
        let filename = '文件名';
        let aDownload = $("<a><span class='downloadFile'></span></a>").attr("href",objectUrl).attr('download',filename);
        $("body").append(aDownload);
        $(".downloadFile").click();
        aDownload.remove();
    });
}

5、动态创建a标签进行下载

思路:与方法4一样,不过获取文件流生成url后,既可以像上面似的动态创建a标签进行下载,也可以使用打开新窗口的方式进行下载,另外,上传数据时记得加{responseType: 'arraybuffer'}
代码如下:

downloadFile(data,type) {
    // 下载类型 xls
    const contentType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
    // 下载类型:csv
    const contentType2 = 'text/csv';
    const blob = new Blob([data], { type: contentType });
    const url = window.URL.createObjectURL(blob);
    // 打开新窗口方式进行下载
    //window.open(url); 
  
    // 以动态创建a标签进行下载
    const a = document.createElement('a');
    let fileName = "下载数据"+new Date().getTime();
    a.href = url;
    a.download = fileName + '.xls';
    a.click();
    window.URL.revokeObjectURL(url);
  }
  -----------------------------------------------------------------------------
  上传的时候加{responseType: 'arraybuffer'}
  this.http.post(`url`,formData, {responseType: 'arraybuffer'})...

以上就是我经常会用到的几个下载方法了,后期碰到其他的,会继续补充,大家有什么其他方法也可以一起交流一下,多多学习~~~