点赞 + 关注 + 收藏 = 学会了
本文介绍一个能让前端优雅下载大文件的工具:StreamSaver.js
StreamSaver.js 可用于实现在Web浏览器中直接将大文件流式传输到用户设备的功能。
传统的下载方式可能导致大文件的加载时间较长或造成内存占用过大的问题,使用 标签打开新页面下载文件,遇到 .txt 或者 .mp4 之类的文件可能就直接在页面展示了,不会触发下载功能。而 StreamSaver.js 则通过流式下载的方式解决了这些问题。
StreamSaver.js 将大文件拆分成小块,并在下载过程中逐块传输到硬盘,从而降低内存占用和提高下载速度。
要学习 StreamSaver.js 首先要准备一份或者多份可下载的文件。
你可以使用网络上的文件资源,但这需要你自己去找。
你也可以在自己的电脑运行个服务,把文件资源丢进去即可。
如果你用脚手架创建项目,比如vue或者react之类的项目,也可以把文件放在静态资源目录里。
比如用 vite 创建一个 Vue 项目,然后在 public 目录下创建一个 test.txt 文件。项目运行起来,在浏览器访问 http://localhost:端口号/public/test.txt 就能查看到这个文件内容。
可以使用 CDN 或者 npm 安装 StreamSaver.js。
本文使用 CDN 的方式讲解。

把 StreamSaver.js 文件下载到你项目里引入即可。
使用以下命令下载 StreamSaver 到项目里
npm i streamsaver然后在要使用的地方引入即可。
import streamSaver from "streamsaver"起步阶段,我们先试试如何下载一个 .txt 文件。
如果我们要下载一些浏览器读不懂的文件,我们可以使用 标签在新窗口打开链接,也可以使用 windows.open('url') 的方式打开新窗口进行下载。
但如果这个文件浏览器是读得懂的,比如 .txt 文件,那浏览器就不会执行下载,而是会直接在页面中把文件内容展示出来。
此时就可以使用 StreamSaver.js 来解决这个问题。
使用 StreamSaver.js 下载文件的大概流程是这样的(为了方便理解,我用一些不专业的术语进行描述):
streamSaver.createWriteStream('文件名.后缀')。fetch 方法访问文件的url,将内容一点点的放到 StreamSaver 创建的文件里。根据上面的指引编写代码:
大概就是这样子了。
🔔提示
如果遇到提示跨域的问题,可以配置 mitm 指向 mitm.html。
mitm.html 在 StreamSaver.js仓库 里可以获取到。

可以把 mitm.html 放到你服务器再配置。
streamSaver.mitm = 'https://你的服务器地址/mitm.html'如果想将多个文件打包成zip下载到本地,可以将 StreamSaver.js 和 zip-stream.js 结合在一起使用。
zip-stream.js 在 StreamSaver.js 的仓库里有。

zip-stream.js 在 /examples 目录里。
使用 npm 安装 streamsaver 也能在 /examples 目录下找到 zip-stream.js,直接引入即可。
import 'node_modules/streamsaver/examples/zip-stream.js'如果使用 CDN 的方式就直接用 引入即可。
打包zip下载的步骤:
zip-stream 创建一个 ZIP 实例,用来不断接收要下载的文件。close() 方法将所有文件真正打包成一个 zip。
点击下载按钮后的效果:

这个例子准备了 .csv 和 .txt 文件。下载时会合并成 .zip,解压后能看到里面的所有文件都是正常能打开的 。
在这个例子中,我要将2个 .csv 文件合并成1个再下载。
我准备了两个 .csv 文件(test1.csv 和 test2.csv),它们的内容分别长这个样子。

我要将它们合并成这样子:

在合并文件之前我们首先要清楚这个文件的内容是如何组成的。
在 Excel 中打开 .csv 的每个单元格的内容转换成文本形式的话是用逗号分隔。

如果要合并多个 .csv 文件,只需监听到每个 .csv 下载完成,然后再拼接一个 \n 换行,再下载下一个 .csv 文件即可。
整理一下就是以下几个步骤:
fetch 请求数据。writer.close() 关闭文件写入。该功能写成真正的代码如下所示:
这个案例稍微复杂一丢丢,建议跟着手敲一遍。
除了本文所讲内容外,StreamSaver.js 的仓库还有好几个实用的例子,有需要的工友可以去看看。
👍《OpenLayers.js 入门教程:打造互动地图的入门指南》
点赞 + 关注 + 收藏 = 学会了 代码仓库