前端实现文件下载的方法

article/2025/11/9 0:54:56

前端实现文件下载

前端下载一般分为两种情况,一种是后端直接给一个文件地址,通过浏览器打开就可以下载,另外一种则需要发送请求,后端返回二进制流数据,前端解析流数据,生成URL,实现下载。

一、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" download="myFileName">

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

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

四、文件流

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

  • 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写法

download(url: string, body: any, fileName: string, method?) {return axios({method: method ||'post',headers: {'Content-Type': 'application/json; charset=utf-8'},url,responseType: 'blob',headers: { //如果需要权限下载的话,加在这里Authorization: '123456'}data: JSON.stringify(params),timeout: 60 * 1000}).then((res: any) => {if (!res) {message.error('下载失败')return}console.log('res:', res)let url = window.URL.createObjectURL(new Blob([res], { type: 'application/vnd.ms-excel' }))let link = document.createElement('a')link.style.display = 'none'link.href = urlif (!fileName || typeof fileName != "string") {fileName = "下载文件"}link.setAttribute('download', fileName + '.xlsx')document.body.appendChild(link)link.click()document.body.removeChild(link); //下载完成移除元素window.URL.revokeObjectURL(url); //释放掉blob对象})
}

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 = fileNamea.style.display = 'none'// 生成的base64编码let url = reader.resulta.href = urldocument.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格式,直接用于业务

五、插件downloadjs

下载

 npm install --save downloadjs

引入插件

import download from "downloadjs"
// or
const download = require('downloadjs')

使用

  export const downloadFile = (res, type, filename) => {// 将二进制流转成blob对象const blob = new Blob([res], {type: type})// 调用插件方法download(blob, filename, type);}

http://chatgpt.dhexx.cn/article/XWo5TSpp.shtml

相关文章

前端项目部署到服务器

1.准备工具 服务器&#xff1a;阿里云 腾讯云 华为云都可以 我这里使用的是阿里云ECS共享型(推荐) xshell&#xff1a;用于远程连接服务器&#xff0c;修改配置文件 xftp&#xff1a;用于连接远程服务器&#xff0c;将本地资源上传到远程服务器 2.服务器设置 1.第一次需重…

微服务前端部署

四.config机器前端部署 1.在config机器上安装jdk1.8,mysql,redis,nacos,nginx安装流程我就不一一解释了,大家可自行百度,后面我会贴上必要的配置信息 2.修改前端的vue.config.js的配置 配置修改:前端ui文件中的index.js文件、vue.config.js文件 如下图: 3.修改后在前端…

前端cookie详解

cookie在前端还是比较总重要的&#xff0c;接下来将总结一下cookie知识点。 将从以下方面去聊一聊cookie。 1、什么样的数据适合放到cookie中。 2、cookie是如何设置的。 3、cookie如何进行携带传送给服务器的。 4、cookie如何实现删除的。1、什么样的数据适合存放在cookie中?…

必背前端八股文

前端八股文 看到一篇特别好的前端八股文&#xff0c;强力推荐 &#x1f525; 连八股文都不懂还指望在前端混下去么 - 掘金 (juejin.cn)https://juejin.cn/post/7016593221815910408

纯前端导出表格

前端 excel 表格导出 我们习惯了后端去处理表格&#xff0c;直接接口返回 &#xff0c;那前端如何轻松的导出表格呢&#xff1f; 文章目录 前端 excel 表格导出Ⅰ. 通过 js-xlsx ⭐⭐⭐⭐⭐安装① vue2 中使用② vue3 中使用③ react 中使用 Ⅲ. 通过 vue-json-excel ⭐⭐安装…

jquery form表单序列化注意事项

我们先来讲讲表单中 中readonly和disabled的区别: readonly只对input和textarea有效, 但是disabled对于所以的表单元素都是有效的&#xff0c;包括radio&#xff0c;checkbox等 如果表单中使用的disabled那么用户是不能选择的&#xff0c;也就是说这个文本框是无法获取到焦点…

jQuery实现表单序列化反序列化

js序列化反序列化参考&#xff1a; https://blog.csdn.net/zqtsx/article/details/17299087 涉及知识点&#xff1a;序列化&#xff1a;var serializeJson JSON.stringify($("#fiveLevelIndexForm").serializeArray());反序列化&#xff1a; var json $.parseJSO…

JQuery表单序列化

方式一&#xff1a;serialize() <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script src"https://cdn.staticfile.org/jquery/3.3.1/jquery.min.js"></sc…

自动阅读脚本源码

如题,提供源码也可以提供技术支持 以下是界面截图和部分脚本源码 使用按键精灵手机版开发的,目前支持十多个主流平台 以下是少量源码截图 有疑问可以加V:848312526

自动阅读,这些坑你都知道吗?

我应该选择一个怎样的脚本&#xff1f; 现在市面上什么样的脚本都有&#xff0c;有免费的&#xff0c;有10块钱的&#xff0c;什么脚本都有。如果你只是想玩玩而已&#xff0c;那你大可随意选择。如果你想要长期稳定的使用&#xff0c;那你就要把眼睛睁大&#xff01;&#xf…

自动阅读专业版第六次更新

源代码下载地址&#xff1a;https://pan.baidu.com/s/1WvhpA-9fhSJOqdVUX6E7jw 提取码&#xff1a;w301 原贴&#xff1a;https://blog.csdn.net/zy0412326/article/details/106297472 第一次更新贴&#xff1a;https://blog.csdn.net/zy0412326/article/details/106421444 …

autojs自动阅读脚本源代码免费分享

autojs上一篇文章讲过了&#xff0c;这篇来实践一下。 一、工具下载安装 手机端&#xff1a;auto.js&#xff08;百度即可&#xff09; PC端&#xff1a; VS Code JDK SDK Tools&#xff08;定位工具: Uiautomatorviewer&#xff09; 注&#xff1a; VS Code 用于代…

Adobe Acrobat Pro DC 2022:专业高效的PDF阅读和编辑利器!

Adobe Acrobat Pro DC 2022是一款功能强大的PDF阅读和编辑软件&#xff0c;是Adobe公司的旗舰产品之一&#xff0c;广泛应用于商业、教育、行政和政府等领域。该软件具有众多高级功能&#xff0c;能够满足各种高级用户的需求。 首先&#xff0c;Adobe Acrobat Pro DC 2022能够快…

畅想阅读自动翻页

畅想阅读自动翻页JavaScript实现 打开相应的阅读书籍通过检查&#xff0c;查找下一页的类名通过F12调出控制台&#xff0c;点击此按钮 然后点击下一页按钮&#xff0c;会出现下面的结果, 选择class里的类名在console中输入以下代码 setInterval(function(){document.getEleme…

博客自动增加阅读量

博客自动增加阅读量 目的步骤准备条件编写基础类注意解决后续 目的 用HttpClient包进行Get请求&#xff0c;从而增加博客的阅读量 步骤 1 拿到所有博客的URL&#xff1a; 我们的博客都是 https://blog.csdn.net/用户ID/article/details/ 文章ID&#xff08;8位&#xff09; …

实现自动阅读的功能

var start document.getElementsByTagName(div)[0]; var stop document.getElementsByTagName(div)[1]; var speed document.getElementsByTagName(div)[2]; var timer 0; var num 10; //多次点击start按钮会产生多个定时器&#xff08;加锁——操作系统学过&#xff09; …

PDF如何自动滚动阅读

PDF如何自动滚动阅读 视图---页面显示---自动滚动 快捷键 Ctrl shiftH

html 自动阅读,自动阅读软件脚本

自动阅读软件脚本是一款非常实用的帮助大家可以自动阅读挂机的软件&#xff0c;生活中多种场景下都可以使用这款软件快速完成任务&#xff0c;自动阅读、自动点赞评论以及刷视频等等的功能一应俱全&#xff0c;支持多个平台上的自阅服务满足大家的需求&#xff0c;想要了解这款…

自动阅读教程--五条app

下面介绍实现五条自动阅读的步骤。&#xff08;只介绍android手机的情况&#xff09; 一、手机连接电脑 首先用usb线将手机连接到电脑上&#xff0c;然后开始菜单中&#xff0c;cmd打开控制台&#xff0c;输入adb devices&#xff0c;会出现如下页面&#xff1a; 这是要记住…

【新】CSDN文章一键打印、输出PDF(自动阅读全文、全清爽模式)

版权声明&#xff1a;本文为丨匿名用户丨原创文章&#xff0c;转载请注明出处&#xff1a;【新】CSDN文章一键打印、输出PDF&#xff08;自动阅读全文、全清爽模式&#xff09;_丨晋丨-CSDN博客_csdn打印https://blog.csdn.net/p1279030826/article/details/106602341 该方法在…