js如何分片下载超出2G的大文件?

news/2024/5/21 2:00:41/文章来源:https://blog.csdn.net/weixin_43576565/article/details/131334460

js如何分片下载超出2G的大文件?

    • 思路
      • 针对超过2G的大文件,通常需要将文件进行分块下载,以避免浏览器的内存溢出或者因为网络连接不稳定而导致整个下载失败的情况。
    • 解释

思路

针对超过2G的大文件,通常需要将文件进行分块下载,以避免浏览器的内存溢出或者因为网络连接不稳定而导致整个下载失败的情况。

下面是一个基本的分块下载的代码样例:

async downloadFile(url, fileName) {const CHUNK_SIZE = 1024 * 1024 * 10 // 每次下载10MBconst response = await fetch(url)const contentRange = response.headers.get('content-range') const fileSize = contentRange ? Number(contentRange.split('/')[1]) : response.headers.get('content-length')const fileStream = []let offset = 0while (offset < fileSize) {const end = Math.min(offset + CHUNK_SIZE, fileSize)const options = {headers: { 'Range': `bytes=${offset}-${end - 1}` }}const blob = await fetch(url, options).then(res => res.blob())fileStream.push(blob)offset = end}const blob = new Blob(fileStream, { type: response.headers.get('content-type') })saveAs(blob, fileName)
}

解释

这段代码使用了Fetch API来下载文件,同时使用了Range头来告诉服务器只需要下载文件的一部分。将文件大小分割为块,每次下载一块数据,最后将数据组合成一个Blob对象进行下载。需要注意的是,如果下载的文件有Content-Range头,则需要先从这个头里获取文件总大小。

async downloadFile(url, fileName) {
  • 这段代码是一个异步函数,用于从给定的URL下载大文件,并使用blob对象保存文件。
  • 该函数需要传入两个参数,一个是要下载的文件的url,另外一个则是下载后要保存的文件名。
const CHUNK_SIZE = 1024 * 1024 * 10 // 每次下载10MB
  • 为了避免下载整个文件的时候因为内存不足而导致的错误,把文件划分成了多个大小相等的块,每次下载一个块的数据。这里设置每次下载的块为10MB。
const response = await fetch(url)
const contentRange = response.headers.get('content-range') 
const fileSize = contentRange ? Number(contentRange.split('/')[1]) : response.headers.get('content-length')
  • 使用Fetch API向服务器请求数据。从响应头里获取了Content-Range,这个头可以告诉服务器只需要下载文件的一部分。如果不存在Content-Range头,那么就通过response.headers.get(‘content-length’)获取文件的总大小。
const fileStream = []
let offset = 0while (offset < fileSize) {const end = Math.min(offset + CHUNK_SIZE, fileSize)const options = {headers: { 'Range': `bytes=${offset}-${end - 1}` }}const blob = await fetch(url, options).then(res => res.blob())fileStream.push(blob)offset = end
}
  • 使用一个while循环将整个文件分块下载,每次下载一块数据。
  • 循环中定义了两个变量:一个是fileStream,用于保存从服务器下载的每个块;另一个则是offset,表示已经下载的数据大小。
  • 在每次循环开始时,首先计算本次下载的起点和终点,然后构造一个包含Range头的选项对象。将起点和终点放在Range头里,这样服务器就只会返回指定范围的数据。最后,使用Fetch API向服务器请求数据,并将用于保存数据的Blob对象推入fileStream数组中。
  • 最后,更新offset的值,表示已经下载的总大小。
const blob = new Blob(fileStream, { type: response.headers.get('content-type') })
saveAs(blob, fileName)
  • 在while循环结束后,将fileStream数组中的所有Blob对象合并为一个Blob对象,并使用FileSaver.js的saveAs函数来将其保存在本地磁盘上。
  • 需要注意的是,在Blob的构造函数中传入了response.headers.get(‘content-type’),这是由于下载的文件类型不一定是常规的文件类型,所以我们需要从响应头中获取正确的文件类型。
  • 以上就是该函数的所有内容,它通过将文件划分为多个块,避免了下载整个大文件时可能导致的内存溢出等问题,并且没有在浏览器中产生任何严重的内存或性能问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_319915.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++篇】初识C++

友情链接&#xff1a;C/C系列系统学习目录 知识点内容正确性以C Primer&#xff08;中文版第五版&#xff09;、C Primer Plus&#xff08;中文版第六版&#xff09;为标准&#xff0c;同时参考其它各类书籍、优质文章等&#xff0c;总结归纳出个人认为较有逻辑的整体框架&…

初识网络之再看tcp协议

目录 一、tcp协议段格式 二、tcp协议的解包 三、tcp协议的分用 四、TCP可靠性问题 1. 不可靠存在原因 2. 常见的不可靠问题 3. 如何保证可靠性 4. 确认应答机制 5. 序号 五、tcp报头其余字段 1. 16位窗口大小 2. tcp的6个标记位 2.1 SYN 2.2 FIN 2.3 ACK 2.4 P…

利用uniapp创建移动端项目

目录 申请微信开发者账号 一、特殊声明 二、申请微信开发者账号 创建小程序项目 一、引言 二、创建小程序工程 三、uni-app框架简介 初识uniapp项目 一、uni-app工程目录结构 二、创建练习页面 创建登录页面 一、拷贝所有素材文件 二、创建登陆页面 创建注册页面 …

leetcode111. 二叉树的最小深度(java)

二叉树的最小深度 leetcode111. 二叉树的最小深度题目描述 DFS 深度优先遍历解题思路代码演示 BFS 广度优先遍历解题思路代码演示 往期经典 leetcode111. 二叉树的最小深度 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problem…

OpenStack(1)-创建实例

目录 一、上传镜像 1.1 新建目录 1.2 上传至glance 1.3 查看镜像 二、新建实例 2.1 获取秘钥 2.2 新建实例 2.3 新建实例admin-vm 2.4 获取实例VNC的url 2.5 nova常用命令 一、上传镜像 1.1 新建目录 上传名为cirros-0.3.4-x86_64-disk.img的Linux测试镜像&#xf…

读营销策划心得

读营销策划心得篇1 过去的一年可算是我工作上另一个转折点&#xff0c;更是一个新的开始。特别是自今年6月份接手营销策划工作&#xff0c;不知不觉&#xff0c;已有半年。回忆这一年的工作经历&#xff0c;有艰辛、有成长、有收获、更有前景。这一年既包含了太多的艰辛与不易&…

Java8 List集合如何指定打印分隔符

目录 背景方法一&#xff1a;String.join&#xff08;推荐&#xff09;方法二&#xff1a;Collectors.joining总结 背景 无论是在学习还是日常的应用开发过程中&#xff0c;我们经常会需要使用分隔符将 List 集合打印出来。 如下所示&#xff1a; import java.util.Arrays;pub…

管理Linux目录、用户、组以及文档的权限和归属

文章目录 一、管理Linux目录和文件1、查看及切换目录pwd&#xff1a;查看当前工作目录cd&#xff1a;切换工作目录ls&#xff1a;列出文档及属性alias&#xff1a;别名cat查看文件内容less分页显示长文件 2.新建目录/文件mkdir 创建目录touch创建文件 3.删除/移动/复制rm删除mv…

【使用Spring Cloud Gateway构建微服务网关】—— 每天一点小知识

&#x1f4a7; 使用 S p r i n g C l o u d G a t e w a y 构建微服务网关 \color{#FF1493}{使用Spring Cloud Gateway构建微服务网关} 使用SpringCloudGateway构建微服务网关&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主…

Pillow库 三分钟带你了解最基础的使用

努力是为了不平庸~ 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰 目录 一、Pillow库是什么 二、以下是 Pillow 的一些主要作用和使用方法的概述&#xff1a; 三、学习使用 Pillow&#xff0c;一个强大的 Python …

Django之模板层

一、模板简介 在刚刚介绍完的视图层中我们提到&#xff0c;浏览器发送的请求信息会转发给视图进行处理&#xff0c;而视图在经过一系列处理后必须要有返回信息给浏览器。如果我们要返回html标签、css等数据给浏览器进行渲染&#xff0c;我们可以在视图中这么做 from django.s…

Dubbo服务发现原理

一、Dubbo服务发现设计 Dubbo提供的是一种Client-Based的服务发现机制&#xff0c;依赖第三方注册中心组件来协调服务发现过程&#xff0c;支持常用的注册中心如Nacos、Connsul、Zookeeper等 Dubbo服务发现机制的基本工作原理图&#xff1a; 服务发现包含提供者、消费者和注册…

supervisor简介

1、概述 supervisor是一个用python语言编写的进程管理工具&#xff0c;它可以很方便的监听、启动、停止、重启一个或多个进程。当一个进程意外被杀死&#xff0c;supervisor监听到进程死后&#xff0c;可以很方便的让进程自动恢复&#xff0c;不再需要程序员或系统管理员自己编…

【操作系统】2、进程与线程

【重要考点】 1. 进程与线程 进程与线程的基本概念 进程与线程的状态 转换 ——五态图&#xff0c;七态图 线程的实现&#xff1a; 内核级 用户级 进程与线程的组织和控制 进程间通信IPC&#xff1a; 共享内存、消息传递、管道 2.CPU调度与上下文切换 调度的基本概念 调度的实…

JMU 软件工程经济学 复习总结

文章目录 碎碎念0. 基准收益率 i1. 现金流量图2. 净现值 NPV&#xff0c;内部收益率 IRR3. 单利&#xff0c;复利计算4. 等额年金NAV5. 动态回收期 P t ′ P_t Pt′​6. 固定资产折旧 [书P44]7. 增值税8. 软件行业增值税的即征即退9. 利息备付率 ICR&#xff0c;偿债备付率 DSC…

深入理解Dockerfile

一、是什么 Dockerfile 是一个用来构建镜像的文本文件&#xff0c;文本内容包含了一条条构建镜像所需的指令和说明。把镜像比喻成一个软件那么DockerFile就相当于是软件的配置文件。具体的内容可参考[官方网站](Dockerfile reference | Docker Documentation。 二、能做什么 通…

E. Tracking Segments - 二分+前缀和

分析&#xff1a; 记录所有区间和给定的每一次的询问&#xff0c;二分询问的最小满足条件&#xff0c;可以通过前缀和来计算区间内有几个1。 代码&#xff1a; #include <bits/stdc.h>#define x first #define y secondusing namespace std;typedef long long ll; type…

LeetCode912排序数组(快速排序机及其优化详解)

LeetCode912排序数组&#xff08;快速排序及其优化详解&#xff09; 文章目录 LeetCode912排序数组&#xff08;快速排序及其优化详解&#xff09;Abstract基本快速排序快速排序思路总结以及优化优化思路针对渐进有序数组针对相同元素较多的数组 Code参考文献 Abstract 我首先…

Unity编辑器扩展-第六集-创建窗口/批量填图

第五集链接&#xff1a;Unity编辑器扩展-第五集-撤回操作/禁止操作/加快捷键_菌菌巧乐兹的博客-CSDN博客 一、本节目标效果展示 1.创建窗口 2.图片批量赋值到物体上 二、创建窗口 这个功能其实也很好理解&#xff0c;我们之前学了点击选择&#xff0c;但我们难免会遇见需要…

收件地址解析成 省+市+区+详细地址的形式

项目中的源代码在我的GitHub&#xff1a;https://github.com/weitw/address-analyzer 先看效果&#xff1a; 如上图&#xff0c;address数输入的地址&#xff0c;Address对象是解析后的地址。可以支持逆推上一级&#xff0c;且支持地址白话解析。 一、项目介绍 1、解析规则 …