前端实现文件下载常见的几种方法总结

 更新时间:2025年01月09日 11:27:58   作者:小周同学_丶  
这篇文章主要给大家介绍了关于前端实现文件下载常见的几种方法,需要的朋友可以参考下

以下是工作中前端常见的文件下载的几种方法。欢迎大家补充指正。

一、location.href

对于一些浏览器无法识别的文件格式,可以直接再浏览器地址栏输入url即可触发浏览器的下载功能。对于单文件下载没有什么问题,但是如果下载多文件,点击过快就会重置掉前面的请求。

适用场景:

  • get请求
  • 单文件下载
window.location.href = url;

二、window.open

和location.href类似

window.open(url);

三、a标签

直接下载仅适用于浏览器无法识别的文件。如果是浏览器支持的文件格式,如html、jpg、png、pdf等,则不会触发文件下载,而是直接被浏览器解析并展示,这种情况下,可以使用a标签下载文件,download属性可以设置文件名。适用于单文件下载,如果下载多文件,点击过快就会重置掉前面的请求。

适用场景:

  • get请求
  • 单文件下载
  • 需要自定义文件名
//写法1
const download = (filename, url) => {
    let a = document.createElement('a'); 
    a.style = 'display: none'; // 创建一个隐藏的a标签
    a.download = filename;
    a.href = url;
    document.body.appendChild(a);
    a.click(); // 触发a标签的click事件
    document.body.removeChild(a);
}
// 写法2
<a href="/images/download.jpg" rel="external nofollow"  download="myFileName">

注意:有时候对于浏览器可识别的文件格式,我们还是需要直接下载的情况,可以声明一下文件的header的 Content-Disposition信息,告诉浏览器,该链接为下载附件链接,并且可以声明文件名。

Content-Disposition: attachment; filename="filename.xls"

四、文件流

如果需要使用post请求,且后端返回是一个文件流形式,那么前端需要自己将文件流转成链接,然后下载。 二进制流大概长这样:

适用场景:

  • post请求
  • get请求
  • 多文件

1.请求的方式

注意:不可以使用JQuery,因为JQuery不支持blob类型。

原生js写法

const req = new XMLHttpRequest();
req.open('POST', '/download/excel', true);
req.responseType = 'blob'; //如果不指定,下载后文件会打不开
req.setRequestHeader('Content-Type', 'application/json');
req.onload = function() {
    var content = req.getResponseHeader("Content-Disposition") ;
    // 文件名最好用后端返的Content-disposition
    // 需要后端设置 Access-Control-Expose-Headers: Content-disposition 使得浏览器将该字段暴露给前端
    var name = content && content.split(';')[1].split('filename=')[1];
    var fileName = decodeURIComponent(name)
    downloadFile(req.response,fileName)
};
req.send( JSON.stringify(params));

 axios写法

axios({
  method: 'post',
  headers: {
    'Content-Type': 'application/json; charset=utf-8'
  },
  url: '/robot/strategyManagement/analysisExcel',
  responseType: 'blob',
  headers: { //如果需要权限下载的话,加在这里
        Authorization: '123456'
    }
  data: JSON.stringify(params),
}).then(function(res){
   var content = res.headers['content-disposition'];
   var name = content && content.split(';')[1].split('filename=')[1];
   var fileName = decodeURIComponent(name)
   downloadFile(res.data,fileName)
})

2.文件下载的方式

通过URL.createObjectURL()下载

URL.createObjectURL() 静态方法会创建一个DOMString,其中包含一个表示参数中给出的对象的URL。这个 URL 的生命周期和创建它的窗口中的document绑定。

downloadFile:function(data,fileName){
    // data为blob格式
    var blob = new Blob([data]);
    var downloadElement = document.createElement('a');
    var href = window.URL.createObjectURL(blob);
    downloadElement.href = href;
    downloadElement.download = fileName;
    document.body.appendChild(downloadElement);
    downloadElement.click();
    document.body.removeChild(downloadElement);
    window.URL.revokeObjectURL(href);
}

通过# FileReader.readAsDataURL()下载

readAsDataURL() 方法会读取指定的 Blob 或 File 对象。读取操作为异步操作,当读取完成时,可以从onload回调函数中通过实例对象的result属性获取data:URL格式的字符串(base64编码),此字符串即为读取文件的内容,可以放入a标签的href属性中。

downloadFile:function(data,fileName){
   const reader = new FileReader()
   // 传入被读取的blob对象
   reader.readAsDataURL(data)
   // 读取完成的回调事件
   reader.onload = (e) => {
       let a = document.createElement('a')
       a.download = fileName
       a.style.display = 'none'
       // 生成的base64编码
       let url = reader.result
       a.href = url
       document.body.appendChild(a)
       a.click()
       document.body.removeChild(a)
   }
}

两者的区别

  • 返回值 FileReader.readAsDataURL(blob)可以得到一段base64的字符串。
    URL.createObjectURL(blob)得到的是当前文件的一个内存 URL
  • 内存 FileReader.readAsDataURL(blob)依照js垃圾回收机制自动从内存中清理。 URL.createObjectURL(blob)存在于当前document内,清除方式通过revokeObjectURL()手动清除。
  • 执行方式 FileReader.readAsDataURL(blob)通过回调的方式f返回,异步执行。
    URL.createObjectURL(blob) 直接返回,同步执行。
  • 多个文件 FileReader.readAsDataURL(blob)同时处理多个文件时,需要一个文件对应一个FileReader对象URL.createObjectURL(blob) 依次返回,没有影响。
  • 优势对比 URL.createObjectURL(blob)得到本地内存容器的 URL地址,方便预览,需要注意手动释放内存的问题,性能优秀。
    FileReader.readAsDataURL(blob)可直接转为base64格式,直接用于业务。

总结 

到此这篇关于前端实现文件下载常见的几种方法的文章就介绍到这了,更多相关前端文件下载方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JS嵌套函数调用上下文的问题解决

    JS嵌套函数调用上下文的问题解决

    这篇文章主要探讨了JS嵌套函数调用上下文的问题,需要的朋友可以参考下
    2014-03-03
  • javascript中sort() 方法使用详解

    javascript中sort() 方法使用详解

    sort()方法主要是用于对数组进行排序,默认情况下该方法是将数组元素转换成字符串,然后按照ASC码进行排序,这个大家都能理解,但如果数组元素是一个Object呢,转不了字符串,难道不能进行排序?答案当然是否定的,那么我们就来详细探讨下sort()方法的使用
    2015-08-08
  • JS cookie中文乱码解决方法

    JS cookie中文乱码解决方法

    本篇文章主要是对JS中的cookie中文乱码解决方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01
  • JavaScript中Set和Map数据结构使用场景详解

    JavaScript中Set和Map数据结构使用场景详解

    这篇文章主要为大家介绍了JavaScript中Set和Map数据结构使用场景详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • ES6中字符串string常用的新增方法小结

    ES6中字符串string常用的新增方法小结

    这篇文章主要介绍了ES6中字符串string常用的新增方法,结合实例形式总结分析了ES6中字符串string常用的新增方法功能与使用技巧,需要的朋友可以参考下
    2017-11-11
  • 微信小程序template模板引入的问题小结

    微信小程序template模板引入的问题小结

    这篇文章主要介绍了微信小程序template模板引入的问题小结,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-07-07
  • Bootstrap实现基于carousel.js框架的轮播图效果

    Bootstrap实现基于carousel.js框架的轮播图效果

    这篇文章主要为大家详细介绍了Bootstrap实现基于carousel.js框架的轮播图效果,无过渡动画,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • JavaScript实现京东放大镜效果

    JavaScript实现京东放大镜效果

    这篇文章主要为大家详细介绍了JavaScript实现京东放大镜效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • JavaScript使用ActiveXObject访问Access和SQL Server数据库

    JavaScript使用ActiveXObject访问Access和SQL Server数据库

    这篇文章主要介绍了JavaScript使用ActiveXObject访问Access和SQL Server数据库,本文分别给出相应操作代码,需要的朋友可以参考下
    2015-04-04
  • JavaScript实现图片伪异步上传过程解析

    JavaScript实现图片伪异步上传过程解析

    这篇文章主要介绍了javascript实现图片伪异步上传过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04

最新评论