码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • StreamSaver.js入门教程:优雅解决前端下载文件的难题


    本文简介

    点赞 + 关注 + 收藏 = 学会了


    本文介绍一个能让前端优雅下载大文件的工具:StreamSaver.js

    • ⚡️ StreamSaver.js GitHub地址
    • ⚡️ 官方案例

    StreamSaver.js 可用于实现在Web浏览器中直接将大文件流式传输到用户设备的功能。

    传统的下载方式可能导致大文件的加载时间较长或造成内存占用过大的问题,使用 标签打开新页面下载文件,遇到 .txt 或者 .mp4 之类的文件可能就直接在页面展示了,不会触发下载功能。而 StreamSaver.js 则通过流式下载的方式解决了这些问题。

    StreamSaver.js 将大文件拆分成小块,并在下载过程中逐块传输到硬盘,从而降低内存占用和提高下载速度。



    环境准备

    要学习 StreamSaver.js 首先要准备一份或者多份可下载的文件。

    你可以使用网络上的文件资源,但这需要你自己去找。

    你也可以在自己的电脑运行个服务,把文件资源丢进去即可。


    如果你用脚手架创建项目,比如vue或者react之类的项目,也可以把文件放在静态资源目录里。

    比如用 vite 创建一个 Vue 项目,然后在 public 目录下创建一个 test.txt 文件。项目运行起来,在浏览器访问 http://localhost:端口号/public/test.txt 就能查看到这个文件内容。



    安装 StreamSaver.js

    可以使用 CDN 或者 npm 安装 StreamSaver.js。

    本文使用 CDN 的方式讲解。


    CDN

    打开 StreamSaver.js的仓库。

    file

    把 StreamSaver.js 文件下载到你项目里引入即可。


      npm

      ⚡️StreamSaver npm地址


      使用以下命令下载 StreamSaver 到项目里

      npm i streamsaver

        然后在要使用的地方引入即可。

        import streamSaver from "streamsaver"


          起步

          起步阶段,我们先试试如何下载一个 .txt 文件。

          如果我们要下载一些浏览器读不懂的文件,我们可以使用 标签在新窗口打开链接,也可以使用 windows.open('url') 的方式打开新窗口进行下载。

          但如果这个文件浏览器是读得懂的,比如 .txt 文件,那浏览器就不会执行下载,而是会直接在页面中把文件内容展示出来。

          此时就可以使用 StreamSaver.js 来解决这个问题。

          使用 StreamSaver.js 下载文件的大概流程是这样的(为了方便理解,我用一些不专业的术语进行描述):

          1. 创建一个文件,该文件支持写入操作。streamSaver.createWriteStream('文件名.后缀')。
          2. 使用 fetch 方法访问文件的url,将内容一点点的放到 StreamSaver 创建的文件里。
          3. 监听文件内容是否读取完整,读取完就执行“保存并关闭文件”的操作。

          根据上面的指引编写代码:

          
          
          
          
          
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24
          • 25
          • 26
          • 27
          • 28
          • 29
          • 30
          • 31

          大概就是这样子了。


          🔔提示

          如果遇到提示跨域的问题,可以配置 mitm 指向 mitm.html。

          mitm.html 在 StreamSaver.js仓库 里可以获取到。

          file

          可以把 mitm.html 放到你服务器再配置。

          streamSaver.mitm = 'https://你的服务器地址/mitm.html'


            打包下载 zip

            如果想将多个文件打包成zip下载到本地,可以将 StreamSaver.js 和 zip-stream.js 结合在一起使用。

            zip-stream.js 在 StreamSaver.js 的仓库里有。

            file

            zip-stream.js 在 /examples 目录里。


            使用 npm 安装 streamsaver 也能在 /examples 目录下找到 zip-stream.js,直接引入即可。

            import 'node_modules/streamsaver/examples/zip-stream.js'

              如果使用 CDN 的方式就直接用 引入即可。


              打包zip下载的步骤:

              1. 创建下载后的文件名和文件格式。
              2. 使用 zip-stream 创建一个 ZIP 实例,用来不断接收要下载的文件。
              3. 所有文件下载完成就执行 close() 方法将所有文件真正打包成一个 zip。

              
              
              
              
              
              • 1
              • 2
              • 3
              • 4
              • 5
              • 6
              • 7
              • 8
              • 9
              • 10
              • 11
              • 12
              • 13
              • 14
              • 15
              • 16
              • 17
              • 18
              • 19
              • 20
              • 21
              • 22
              • 23
              • 24
              • 25
              • 26
              • 27
              • 28
              • 29
              • 30
              • 31
              • 32
              • 33
              • 34
              • 35
              • 36
              • 37
              • 38
              • 39
              • 40
              • 41
              • 42
              • 43
              • 44

              点击下载按钮后的效果:

              file

              这个例子准备了 .csv 和 .txt 文件。下载时会合并成 .zip,解压后能看到里面的所有文件都是正常能打开的 。



              合成文件再下载

              在这个例子中,我要将2个 .csv 文件合并成1个再下载。

              我准备了两个 .csv 文件(test1.csv 和 test2.csv),它们的内容分别长这个样子。

              file

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

              file


              在合并文件之前我们首先要清楚这个文件的内容是如何组成的。

              在 Excel 中打开 .csv 的每个单元格的内容转换成文本形式的话是用逗号分隔。

              file

              如果要合并多个 .csv 文件,只需监听到每个 .csv 下载完成,然后再拼接一个 \n 换行,再下载下一个 .csv 文件即可。


              整理一下就是以下几个步骤:

              1. 拿到一组下载地址,把它们转存到一个迭代器里。
              2. 递归执行迭代器,如果迭代器里还有内容,就使用 fetch 请求数据。
              3. 如果迭代器没内容了,使用 writer.close() 关闭文件写入。

              该功能写成真正的代码如下所示:

              
              
              
              
              • 1
              • 2
              • 3
              • 4
              • 5
              • 6
              • 7
              • 8
              • 9
              • 10
              • 11
              • 12
              • 13
              • 14
              • 15
              • 16
              • 17
              • 18
              • 19
              • 20
              • 21
              • 22
              • 23
              • 24
              • 25
              • 26
              • 27
              • 28
              • 29
              • 30
              • 31
              • 32
              • 33
              • 34
              • 35
              • 36
              • 37
              • 38
              • 39
              • 40
              • 41
              • 42
              • 43
              • 44
              • 45
              • 46
              • 47
              • 48
              • 49
              • 50
              • 51
              • 52
              • 53
              • 54
              • 55
              • 56
              • 57
              • 58
              • 59
              • 60
              • 61
              • 62
              • 63
              • 64
              • 65
              • 66
              • 67
              • 68
              • 69

              这个案例稍微复杂一丢丢,建议跟着手敲一遍。



              推荐阅读

              除了本文所讲内容外,StreamSaver.js 的仓库还有好几个实用的例子,有需要的工友可以去看看。


              👍《前端中文汉字转拼音》

              👍《提升日期处理效率:day.js 实战经验分享》

              👍《眨个眼就学会了Pixi.js》

              👍《OpenLayers.js 入门教程:打造互动地图的入门指南》

              👍《物理世界的互动之旅:Matter.js入门指南》

              👍《p5.js 光速入门》


              点赞 + 关注 + 收藏 = 学会了 代码仓库

            • 相关阅读:
              mirai登陆失败反复验证码或提示登录存在安全风险的解决方法
              【VIM】VIM中的保存和退出、VIM退出命令、如何退出vim编辑、VIM命令大全
              大数据 安装配置centOS
              2020 Java开发者数据分析:中国已成为 Java 第一大国
              聚观早报 | 问界新 M7 车型破单日大定纪录;iQOO 12影像大升级
              Redis变慢?深入浅出Redis性能诊断系列文章(一)
              iOS ActivityViewController使用
              codesys 6轴机器人正解程序
              [附源码]java毕业设计超市收银系统论文
              COM组件中调用JavaScript函数的实例讲解
            • 原文地址:https://blog.csdn.net/weixin_39415598/article/details/134085094
            • 最新文章
            • 攻防演习之三天拿下官网站群
              数据安全治理学习——前期安全规划和安全管理体系建设
              企业安全 | 企业内一次钓鱼演练准备过程
              内网渗透测试 | Kerberos协议及其部分攻击手法
              0day的产生 | 不懂代码的"代码审计"
              安装scrcpy-client模块av模块异常,环境问题解决方案
              leetcode hot100【LeetCode 279. 完全平方数】java实现
              OpenWrt下安装Mosquitto
              AnatoMask论文汇总
              【AI日记】24.11.01 LangChain、openai api和github copilot
            • 热门文章
            • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
              奉劝各位学弟学妹们,该打造你的技术影响力了!
              五年了,我在 CSDN 的两个一百万。
              Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
              面试官都震惊,你这网络基础可以啊!
              你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
              心情不好的时候,用 Python 画棵樱花树送给自己吧
              通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
              13 万字 C 语言从入门到精通保姆级教程2021 年版
              10行代码集2000张美女图,Python爬虫120例,再上征途
            Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
            正则表达式工具 cron表达式工具 密码生成工具

            京公网安备 11010502049817号