JavaScript 创建下载文件之Blob和File

简介: 文件下载,过去一般由后端程序在服务器端生成文件,然后前端通过打开链接的方式从服务器端下载数据,而需要下载的文件在服务器上会有一个临时文件或者永久存在的文件。随着浏览器的发展和高级浏览器的普及,文件下载可以通过接口获取相应的文件流,然后在前端生成相应的下载文件和链接地址,这种方式一般在服务器端没有临时文件或者永久文件,而是将文件数据流存储在数据库中。

文件下载,过去一般由后端程序在服务器端生成文件,然后前端通过打开链接的方式从服务器端下载数据,而需要下载的文件在服务器上会有一个临时文件或者永久存在的文件。随着浏览器的发展和高级浏览器的普及,文件下载可以通过接口获取相应的文件流,然后在前端生成相应的下载文件和链接地址,这种方式一般在服务器端没有临时文件或者永久文件,而是将文件数据流存储在数据库中。

本文将介绍通过原生 JavaScript 生成文件和下载文件的方式。

生成文件

对于使用文件,浏览器中有高级对象  File API ,现在已经得到浏览器厂商的广泛支持。使用它创建一个文件非常的简单, File 接口基于 Blob,继承 Blob 功能并对其进行扩展以支持用户系统上的文件。如下:

const file = new File(["DevPoint,开发技术点"], "info.md", {
    type: "text/plain",
});

具体参数描述如下:

  • 数据数组:第一个参数,它可以是BlobArrayBuffer,或者字符串。
  • 文件名:第二个参数为文件名称,包括文件后缀。
  • 文件配置:这是一个可选参数,传递文件的实际类型。

为了生成一个文件,包含 text/plain 类型(文本、HTML、CSV 等)数据的文件,生成更抽象的文件类型需要使用 blob 或缓冲区。

CSV或者EXCEL:

const file = new File([filedata], "info.xlsx", {
    type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
});

Blob

ArrayBuffer 是 ECMA 标准的一部分,也可以说是 JavaScript 的一部分。在浏览器中生成文件,除了上面介绍的高级对象 File API 中进行了描述,还有 Blob。

Blob(Binary Large Object)表示二进制类型的大对象。在数据库管理系统中,将二进制数据存储为一个单一个体的集合。Blob 通常是影像、声音或多媒体文件。在 JavaScript 中 Blob 类型的对象表示不可变的类似文件对象的原始数据。

Blob 由一个可选的字符串类型(通常是 MIME 类型)和 blobParts 组成:其他 Blob 对象、字符串和 BufferSource 的序列。

image.png

构造函数语法是:

new Blob(blobParts, options);
  • blobParts:是 Blob/BufferSource/String 值的数组
  • options:可选对象
  • type:Blob 类型,通常是 MIME 类型,例如 text/plain
  • endings:默认值为 transparent ,用于指定包含行结束符 \n 的字符串如何被写入。 它是以下两个值中的一个:native,代表行结束符会被更改为适合宿主操作系统文件系统的换行符,或者 transparent,代表会保持 blob 中保存的结束符不变。

下载文件

要检查创建文件是否有效,需要访问它,并进行下载。

实现的方式是生成一个包含对文件引用的链接。然后,让 JavaScript 出发时间 click 来点击链接,这样文件就可以下载了。

为了接收文件 URL,需要使用 URL.createObjectURL() 方法将接收文件对象作为参数。然后,通过设置链接的下载属性,指定保存的文件默认名称。

最后,在 DOM 中挂载链接,单击它后,将其从 DOM 中删除。以下是完整的代码:

const file = new File(["DevPoint,开发技术点"], "info.md", {
    type: "text/plain",
});
function download(downfile) {
    const tmpLink = document.createElement("a");
    const objectUrl = URL.createObjectURL(downfile);
    tmpLink.href = objectUrl;
    tmpLink.download = downfile.name;
    document.body.appendChild(tmpLink);
    tmpLink.click();
    document.body.removeChild(tmpLink);
    URL.revokeObjectURL(objectUrl);
}
download(file);

如果是通过接口的形式获取文件流并生成下载文件,就可以参照以下 Vue 代码片段:

apiClient
    .get(apiFileUrl, {
        responseType: "arraybuffer",
    })
    .then((response) => {
        const { headers, data } = response;
        const fileinfo = {
            blobData: data,
            fileName: ((strDispostion) => {
                if (strDispostion) {
                    if (
                        strDispostion !== "" &&
                        strDispostion.split("filename=").length > 1
                    ) {
                        return decodeURIComponent(
                            strDispostion.split("filename=")[1]
                        );
                    } else {
                        return "tempname";
                    }
                }
            })(headers["content-disposition"]),
        };
        const tmpLink = document.createElement("a");
        const { blobData, fileName } = fileinfo;
        const blob = new Blob([blobData], {
            type:
                "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
        });
        const objectUrl = URL.createObjectURL(blob);
        tmpLink.href = objectUrl;
        tmpLink.download = fileName;
        document.body.appendChild(tmpLink); // 如果不需要显示下载链接可以不需要这行代码
        tmpLink.click();
        URL.revokeObjectURL(objectUrl);
    });


相关文章
|
JavaScript API
深入探索fs.WriteStream:Node.js文件写入流的全面解析
深入探索fs.WriteStream:Node.js文件写入流的全面解析
|
8月前
|
Web App开发 存储 数据处理
Chrome 下载大文件报错!用 Streamsaver.js 完美填坑
本文探讨了Chrome下载大文件报“网络错误”的原因及解决方案。由于Chrome对Blob数据有大小限制,导致大文件下载失败。通过将responseType改为ArrayBuffer可临时解决1-2G文件问题,但超3G仍会崩溃。最佳方案是使用Streamsaver.js实现流式下载,边接收边保存,避免内存溢出,完美支持超大文件下载。
4714 3
|
数据采集 Web App开发 JavaScript
Puppeteer自动化:使用JavaScript定制PDF下载
在现代Web开发中,自动化工具如Puppeteer可显著提升效率并减少重复工作。Puppeteer是一款强大的Node.js库,能够控制无头Chrome或Chromium浏览器,适用于网页快照生成、数据抓取及自动化测试等任务。本文通过示例展示了如何使用Puppeteer自动化生成定制化的PDF文件,并介绍了如何通过配置代理IP、设置user-agent和cookie等技术增强自动化过程的灵活性与稳定性。具体步骤包括安装Puppeteer、配置代理IP、设置user-agent和cookie等,最终生成符合需求的PDF文件。此技术可应用于报表生成、发票打印等多种场景。
769 6
Puppeteer自动化:使用JavaScript定制PDF下载
|
12月前
|
存储 前端开发 JavaScript
仿真银行app下载安装, 银行卡虚拟余额制作app,用html+css+js实现逼真娱乐工具
这是一个简单的银行账户模拟器项目,用于学习前端开发基础。用户可进行存款、取款操作,所有数据存储于浏览器内存中
|
10月前
|
编解码 JavaScript 前端开发
如何在网页播放英文的m3u8文件(基于Javascript搭建的在线网页工具)
什么是m3u8?又该如何在网页中高效、便捷地播放英文的m3u8文件呢?今天这篇文章就带你一起了解,并推荐一种基于Javascript搭建的在线网页工具,让你轻松解决播放问题。
3075 0
|
JavaScript 前端开发 内存技术
js文件的入口代码及需要入口代码的原因
js文件的入口代码及需要入口代码的原因
269 0
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
681 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
前端开发
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
1238 1
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
|
JavaScript 前端开发
Node.js 中实现多任务下载的并发控制策略
Node.js 中实现多任务下载的并发控制策略
571 15
|
JavaScript 前端开发 API
Next.js 实战 (六):如何实现文件本地上传
这篇文章介绍了在Next.js中如何实现文件上传到本地的方法。文章首先提到Next.js官方文档中没有提供文件上传的实例代码,因此开发者需要自行实现,通常有两种思路:使用Node.js原生上传或使用第三方插件如multer。接着,文章选择了使用Node.js原生上传的方式来讲解实现过程,包括如何通过哈希值命名文件、上传到指定目录以及如何分类文件夹。然后,文章展示了具体的实现步骤,包括编写代码来处理文件上传,并给出了代码示例。最后,文章通过一个效果演示说明了如何通过postman模拟上传文件,并展示了上传后的文件夹结构。
516 0
Next.js 实战 (六):如何实现文件本地上传