大文件分片【笔记】

embedded/2024/9/25 16:53:40/

    createChunk.js

   Spark-md5计算文件各分片MD5生成文件指纹

可以帮助我们更加方便地进行文件哈希计算和文件完整性检测等操作。

javascript">    import sparkMd5 from './sparkmd5.js'export function createChunk(file, index, chunkSize) {return new Promise((resolve, reject) => {const start = index * chunkSize;const end = start + chunkSize;const spark = new sparkMd5.ArrayBuffer();const fileReader = new FileReader();const blob = file.slice(start, end);fileReader.onload = (e) => {spark.append(e.target.result);//耗时阻塞resolve({start, end, index, hash: spark.end(), blob});};fileReader.readAsArrayBuffer(blob);})}

cutFile.js

javascript">       import {createChunk} from './createChunk.js'const CHUNK_SIZE = 1024 * 1024 * 5;export async function cutFile(file) {const result = [];/* 普通写法 速度慢 md5阻塞*/// const chunkCount = Math.ceil(file.size / CHUNK_SIZE);// for (let i = 0; i < chunkCount; i++) {//     const chunk = await createChunk(file, i, CHUNK_SIZE);//     result.push(chunk)// }new Promise((resolve, reject) => {const finishCount = 0;//完成数量const chunkCount = Math.ceil(file.size / CHUNK_SIZE);/* 多线程写法 */const THREAD_COUNT = navigator.hardwareConcurrency || 4;//获取线程数const threadChunkCount = Math.ceil(chunkCount / THREAD_COUNT)//分发计算每个线程的分片数量for (let i = 0; i < threadChunkCount; i++) {//创建多线程,并分配任务const worker = new Worker('./worker.js', { type: 'module' });let end = (i + 1) * threadChunkCount;const start = i * threadChunkCount;if (end > chunkCount) {end = chunkCount}worker.postMessage({file,CHUNK_SIZE,startChunkIndex: start,endChunkIndex: end});worker.onmessage = e => {for (let i = start; i < end; i++) {result[i] = e.data[i - start]//分片结果以次放到对应下标}if (finishCount === THREAD_COUNT) {resolve(result)}}}})}

worker.js 线程文件

javascript">    onmessage = async (e) => {const {file,CHUNK_SIZE,startChunkIndex: start,endChunkIndex: end,} =e.data;const proms=[];for(let i=start;i<end;i++){proms.push(createChunk(file,i,CHUNK_SIZE));}const t= await Promise.all(proms);//等待分片完成postMessage(t)//分片结果传递给主线程};

应用

javascript"> //oncheange 上传文件的按钮import {cutFile} from './cutFile.js'async function oncheange(e) {const file = e.target.files[0];const chunks = await cutFile(file)}


http://www.ppmy.cn/embedded/45684.html

相关文章

系统架构设计师【第1章】: 绪论 (核心总结)

文章目录 1.1 系统架构概述1.1.1 系统架构的定义及发展历程1.1.2 软件架构的常用分类及建模方法1.1.3 软件架构的应用场景1.1.4 软件架构的发展未来 1.2 系统架构设计师概述1.2.1 架构设计师的定义、职责和任务1.2.2 架构设计师应具备的专业素质1.2.3 架构设计师的知识…

配置Zabbix自定义监控、自动发现与注册及代理与Windows监控

目录 引言 一、自定义监控内容 &#xff08;一&#xff09;添加监控主机 &#xff08;二&#xff09;添加自定义监控内容 &#xff08;三&#xff09;自定义监控模板 1.创建模板 2.创建应用集 3.创建监控项 4.创建触发器 5.创建图形 6.主机与模板关联 7.设置邮件报…

iOS hitTest 机制用处之二-----使用pointInside方法

hittest 机制 下面是伪代码 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{if (self.hidden NO || self.alpha < 0.05 || self.userInteractionEnabled NO) {//1.当满足这几个条件时&#xff0c;直接丢弃touch事件&#xff0c;不再向下分发。return n…

初识SDN

初识SDN 软件定义网络&#xff08;SDN&#xff0c;Software-Defined Networking&#xff09;是一种网络架构方法&#xff0c;它通过将网络控制平面与数据平面分离来实现网络的集中化控制和管理。 基本概念 以下是SDN的关键概念和组成部分&#xff1a; 1. SDN的基本概念 控制…

苹果设备mac/Paid/phone 下载使用anki记忆卡

安卓的设备直接可以下 如果你这个&#xff0c;如图。 首先点击下列网址&#xff0c;下载&#xff0c;在里面搜索anki记忆卡 https://www.i4.cn 下载好&#xff0c;打开应用软件爱思助手。搜索anki记忆卡&#xff0c;下载&#xff0c;然后用数据线一端连接电脑一端连接手机或者…

net/http与gin框架的关系分析

要想学好 gin 框架&#xff0c;首先要学习 net/http 服务&#xff0c;而二者的关系又是重中之重。 本文所要做的任务就是将二者“连接” 起来&#xff0c;让读者掌握其中之精髓。 一、Golang HTTP 标准库示例 使用 golang 启动 http 服务非常简单&#xff0c;就是一个标准的 C…

uniapp实现微信小程序调用云函数【vue3】

本人是从微信开发者工具写原生微信小程序一步一步走来&#xff0c;由于vue3框架的慢慢的步入前端市场&#xff0c;为了不被前端市场遗弃&#xff0c;果断从vue2开始步入vue3的学习&#xff0c;本人习惯在在HBuilder X写uniapp的项目&#xff0c;过去uniapp默认vue2框架&#xf…

LangChain学习之prompt格式化与解析器使用

1. 学习背景 在LangChain for LLM应用程序开发中课程中&#xff0c;学习了LangChain框架扩展应用程序开发中语言模型的用例和功能的基本技能&#xff0c;遂做整理为后面的应用做准备。视频地址&#xff1a;基于LangChain的大语言模型应用开发构建和评估高 2. 先准备尝试调用O…