js 通过流的方式进行下载(js调用浏览器下载文件)
myzbx 2025-06-28 15:25 3 浏览
背景
项目上需要用到多语言,项目设计语言选择是通过header传递的,如果直接用平时location.href下载并无法实现这个效果,然后在网上查阅了一些资料,可以通过流处理来实现下载,代码如下
downloadFile(){
let timestamp = new Date().getTime(); //时间戳
let url =XXXXXXXXXXXX;
let xmlResquest = new XMLHttpRequest();
xmlResquest.open("GET", url, true);
xmlResquest.setRequestHeader("Authorization", "bearer" + this.token); //token验证
xmlResquest.responseType = "blob";
xmlResquest.onload = function(oEvent) { //接口响应后的处理
var content = xmlResquest.response; // 组装a标签
let elink = document.createElement("a");// 设置下载文件名
elink.download = "track-kml-" + timestamp + ".kml";
elink.style.display = "none";
let blob = new Blob([content]);
elink.href = URL.createObjectURL(blob);
document.body.appendChild(elink);
elink.click();
document.body.removeChild(elink);
URL.revokeObjectURL(blob); //释放对象
};
xmlResquest.send();
}
本着不懂就学的原则,查阅了部分不懂的方法,以下资料来源MDN
URL.createObjectURL
URL.createObjectURL() 静态方法会创建一个 DOMString,其中包含一个表示参数中给出的对象的URL。这个 URL 的生命周期和创建它的窗口中的 document 绑定。这个新的URL 对象表示指定的 File 对象或 Blob 对象。
内存管理
在每次调用 createObjectURL() 方法时,都会创建一个新的 URL 对象,即使你已经用相同的对象作为参数创建过。当不再需要这些 URL 对象时,每个对象必须通过调用 URL.revokeObjectURL() 方法来释放。浏览器会在文档退出的时候自动释放它们,但是为了获得最佳性能和内存使用状况,你应该在安全的时机主动释放掉它们。
XMLHttpRequest.responseType
XMLHttpRequest.responseType 属性是一个枚举类型的属性,返回响应数据的类型。它允许我们手动的设置返回数据的类型。如果我们将它设置为一个空字符串,它将使用默认的"text"类型。
在工作环境(Work Environment)中将responseType的值设置为"document"通常会被忽略. 当将responseType设置为一个特定的类型时,你需要确保服务器所返回的类型和你所设置的返回值类型是兼容的。那么如果两者类型不兼容呢?恭喜你,你会发现服务器返回的数据变成了null,即使服务器返回了数据。还有一个要注意的是,给一个同步请求设置responseType会抛出一个InvalidAccessError 的异常。
responseType支持以下几种值:
值 | 描述 |
"" | 将 responseType 设为空字符串与设置为"text"相同, 是默认类型 (实际上是 DOMString)。 |
"arraybuffer" | response 是一个包含二进制数据的 JavaScript ArrayBuffer 。 |
"blob" | response 是一个包含二进制数据的 Blob 对象 。 |
"document" | response 是一个 HTML Document 或 XML XMLDocument ,这取决于接收到的数据的 MIME 类型。请参阅 HTML in XMLHttpRequest 以了解使用 XHR 获取 HTML 内容的更多信息。 |
"json" | response 是一个 JavaScript 对象。这个对象是通过将接收到的数据类型视为 JSON 解析得到的。 |
"text" | response 是包含在 DOMString 对象中的文本。 |
"moz-chunked-arraybuffer" | 与"arraybuffer"相似,但是数据会被接收到一个流中。使用此响应类型时,响应中的值仅在 progress 事件的处理程序中可用,并且只包含上一次响应 progress 事件以后收到的数据,而不是自请求发送以来收到的所有数据。 在 progress 事件处理时访问 response 将返回到目前为止收到的数据。在 progress 事件处理程序之外访问, response 的值会始终为 null 。 |
"ms-stream" | response 是下载流的一部分;此响应类型仅允许下载请求,并且仅受Internet Explorer支持。 |
相关推荐
- C语言备忘录 - 09. 数组与字符串(c语言数组字符串长度)
-
C语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。一、数组定义/*定义一个一维数组数...
- Java 读取 xml 文件的五种方式(java读取xml工具类)
-
1、Java读取xml文件的五种方式在Java中读取XML文件有多种方法,这里列出五种常见的方式:DOM解析器(DocumentObjectModel):DOM是处理XML文...
- 如何获取一个APP的所有接口API和参数签名信息?
-
先给出所需的工具:步骤工具/技术抓包Charles、Fiddler、Wireshark、tcpdump反编译Jadx、JEB、Apktool动态调试Frida、IDAPro、Unidbg/Unico...
- 编辑距离算法详解:Levenshtein Distance算法
-
算法基本原理:假设我们可以使用d[i,j]个步骤(可以使用一个二维数组保存这个值),表示将串s[1…i]转换为串t[1…j]所需要的最少步骤个数,那么,在最基本的情况下,即在i等...
- RTCP协议详解(SR、RR、SDES、BYE、APP、NACK、TCC、PLI、SLI)
-
RTCP协议规范中定义了五种类型的RTCP包:接收方报告(RR)、发送方报告(SR)、源描述(SDES)、成员管理(BYE)和应用程序定义(APP)。SR:payload...
- javascript实现获取中文汉字拼音首字母
-
今天分享一个日常开发中可能会用到的一个小功能,简单说就是输入中文汉字可转换得到中文汉字拼音首字母。当然我可写不出这样的功能,源码来自于其他民间大神的分享,博主在此记录一下功能demo,方便日后复用,同...
- 记一次前端逻辑绕过登录到内网挖掘
-
前言在测试一个学校网站的时候发现一个未授权访问内网系统,但是这个未授权并不是接口啥的,而是对前端js的审计和调试发现的漏洞,这里给大家分享一下这次的漏洞的过程文章中涉及的敏感信息均已做打码处理,文...
- Node.js 是怎么找到模块的?(node.js有哪些模块)
-
大家好,我是前端西瓜哥,今天我们来看看Node.js模块查找的原理。模块种类模块有三种来源。核心模块:Node.js内置的包。比如http、fs、path;自定义模块:NPM包。比如axi...
- 细节确定成败!全网最详细的xxs夸脚本攻击以及测试方法(上)
-
XSS全称是CrossSiteScripting也是跨站脚本,他也分为三种类型存储型,反射型,DOM型。当目标网站目标用户浏览器渲染HTML文档的过程中,出现了不被预期的脚本指令并执行时,XSS就...
- 简单易懂的KMP字符串匹配算法(实现kmp字符串匹配)
-
什么是KMPKMP算法是Knuth、Morris和Pratt三人设计的线性时间字符串匹配算法。算法的核心思想是尽可能地利用已知信息,减少尝试匹配的次数,从而降低时间复杂度。要想彻底地弄懂KMP算法,需...
- golang标准库每日一库之strings(golang 字符串操作)
-
以下为Go语言strings包的深度解析,涵盖字符串切割、替换、查找等核心操作及高效处理技巧:一、基础字符串操作1.字符串切割(Split)函数作用描述示例strings.Split(s,s...
- 开源轻量级BT下载器qBittorrent 5.1.1发布:改进Wayland会话
-
IT之家6月24日消息,科技媒体9to5Linux昨日(6月23日)发布博文,报道称开源轻量级BT下载器qBittorrent发布5.1.1版本更新,主要改进支持Lin...
- 晨雾轻散时!2 道 JS 面试题细解,静享知识慢时光
-
清晨的雾气渐渐散去,阳光透过纱窗洒在桌前,泡一杯温热的蜂蜜水,让我们在这宁静的氛围里,以轻松的节奏聊聊两道JavaScript高频面试题。就像在晨光中散步,不急不躁地探索知识,让学习成为一种治愈的...
- JS 写正则表达式,判断是否为手机号
-
以下是使用JavaScript写正则表达式,判断一个字符串是否为手机号的示例代码:在上述代码中,我们定义了一个isPhoneNumber函数,该函数接收一个字符串作为参数,使用正则表达式判断该...
- 不用任何 js 库,纯前端导出数据到 Excel / CSV 文件就简单几行代码
-
最近实现的导出数据为表格的需求,不需要工具库,也不要后端实现,mark一下。js导出excel表格最近工作中又遇到了将表格数据导出为excel表格的需求,我第一时间想到的是之前我的网站上推...
- 一周热门
- 最近发表
-
- C语言备忘录 - 09. 数组与字符串(c语言数组字符串长度)
- Java 读取 xml 文件的五种方式(java读取xml工具类)
- 如何获取一个APP的所有接口API和参数签名信息?
- 编辑距离算法详解:Levenshtein Distance算法
- RTCP协议详解(SR、RR、SDES、BYE、APP、NACK、TCC、PLI、SLI)
- javascript实现获取中文汉字拼音首字母
- 记一次前端逻辑绕过登录到内网挖掘
- Node.js 是怎么找到模块的?(node.js有哪些模块)
- 细节确定成败!全网最详细的xxs夸脚本攻击以及测试方法(上)
- 简单易懂的KMP字符串匹配算法(实现kmp字符串匹配)
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 选择器 (30)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)
- 时钟启动 (33)
- HTML 游戏 (34)