vue3 + Element + nodejs 大文件上传、断点续传

前言

        大文件上传,一般时间都比较长,这么长的时间内,可能会出现各种各样的问题,比如断网,一旦出错,我们的文件就需要重新上传,这样造成资源浪费,如果我们使用了断点续传继续就不会造成资源浪费了,因为当出现错误的时候,我们再重新上传文件,就会从我们出现错误的地方开始上传了,对于出错前上传的内容就不用再上传了,对于已经上传过的文件,就可以实现秒传的效果了。

完整仓库地址

流程

1、上传方法

const onUpload = async ({ file }) => {if (!file) return;// 文件切片const chunks = createChunks(file);// 计算哈希值const hash = await calculateHash(chunks);// 校验是否曾经上传过const { data } = await verifyFile(hash, file.name);if (!data.shouldUpload) {// 这里就相当于是秒传了,只需要将提示语改一下即可ElMessage.warning("文件已存在");return;}// 上传文件切片await uploadChunks(chunks, file.name, hash, data.existsChunks);// 发送合并请求await mergeRequest(hash, file.name);
};

2、将文件切片

const createChunks = (file) => {const chunks = [];let cur = 0;while (cur < file.size) {chunks.push(file.slice(cur,cur + CHUNK_SIZE > file.size ? file.size : cur + CHUNK_SIZE));cur += CHUNK_SIZE;}return chunks;
};

3、计算文件哈希值

const calculateHash = (chunks) => {// 为什么要用promise? 因为reader.onload是异步的return new Promise((resolve) => {// 文件如果太大了,每个切片都计算一遍哈希值,时间会很长// 所以可以这样来计算,第一及最后一个切片计算完整哈希值,其他切片只计算前2个字节、中间两个、后面2个字节const newChunks = [];const MID = CHUNK_SIZE / 2;chunks.forEach((chunk, index) => {if (index === 0 || index === chunks.length - 1) {newChunks.push(chunk);} else {newChunks.push(chunk.slice(0, 2));newChunks.push(chunk.slice(MID, MID + 2));newChunks.push(chunk.slice(CHUNK_SIZE - 2, CHUNK_SIZE));}});const spark = new SparkMD5.ArrayBuffer();const reader = new FileReader();// 由于onload是异步的所以需要用Promise,读取文件切片读取完毕就把哈希值返回出去reader.onload = (e) => {spark.append(e.target.result);resolve(spark.end());};// 读取文件切片 返回一个ArrayBuffer数据对象,为了就是传给 spark// 因为spark new SparkMD5.ArrayBuffer()创建的 只接收ArrayBuffer数据对象reader.readAsArrayBuffer(new Blob(newChunks));});
};

4、校验文件是否上传过

这块主要是调用后端接口,具体数据可以与后端商议(实际开发过程中一般是java后端与我们这里的nodejs不一样)

// 校验文件是否已经上传过
const verifyFile = async (fileHash, fileName) => {const res = await axios.post("http://localhost:3000/verify",{fileHash,fileName,size: CHUNK_SIZE,},{headers: {"Content-Type": "application/json",},});return res;
};

5、上传切片

const uploadChunks = async (chunks, fileName, hash, existsChunks) => {// 将切片转成formDatas数据,过滤已经上传的切片let formDatas = chunks.map((chunk, index) => {const formData = new FormData();formData.append("fileHash", hash);formData.append("chunkHash", hash + "-" + index);formData.append("chunk", chunk);return formData;});// 过滤掉已经上传的切片formDatas = formDatas.filter((item) => !existsChunks.includes(item.get("chunkHash")));const requestPool = [];let index = 0;while (index < formDatas.length) {const request = axios.post("http://localhost:3000/upload",formDatas[index]);// 将当前请求添加到请求池中requestPool.push(request);// 请求数量加1index++;}await Promise.all(requestPool);
};

6、发送合并请求

// 合并请求
const mergeRequest = async (fileHash, fileName) => {const res = await axios.post("http://localhost:3000/merge",{fileHash,fileName,size: CHUNK_SIZE,},{headers: {"Content-Type": "application/json",},});if (res.data.ok) {ElMessage.success("上传成功");}
};

以上便是大文件上传全部内容了,这是一个简略的demo, 如果有大佬指教一下就更好了

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

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

相关文章

ES6 Fetch API的基础使用

XMLHttpRequest 的问题 所有的功能全部几乎在同一个对象上&#xff0c;容易书写出混乱不易维护的代码 采用传统的事件驱动模式&#xff0c;无法适配的 Promise Api Fetch Api 的特点 并非取代 AJAX,而是对 AJAX 传统 API 的改进 精细的功能分割:头部信息、请求信息、响应信…

javaScript——BFS结合队列求迷宫最短路径

这里推荐先去看下B站这个老师讲的BFS迷宫问题&#xff0c;只用看前五分钟就能懂用BFS队列实现的原理。[POJ] 3984 迷宫问题 BFS_哔哩哔哩_bilibili 问题描述&#xff1a;由m*n的矩阵构成了一个迷宫&#xff0c; 矩阵中为1的元素表示障碍物&#xff0c;不能走&#xff0c;为0表示…

如何在职场中提升自己的竞争力

随着社会的发展&#xff0c;职场竞争日益激烈。如何在职场中提升自己的竞争力&#xff0c;成为许多职场人士关注的焦点。本文将从以下几个方面为大家提供一些建议。 一、不断学习&#xff0c;提升专业技能 在职场中&#xff0c;专业技能是衡量一个人竞争力的重要标准。要想在职…

软考高级:项目管理-软件质量控制和质量保证概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

让数据在两个buckets之间传输 - Google Storage Transfer Service

在业务场景中&#xff0c; 有时我们不想直接暴露数据存储空间给上游系统&#xff0c; 而需要设置1个landing Path 让上游系统发送数据 如图&#xff1a; 我们只需grant landing bucket 的权限给上游系统&#xff0c; 而上游系统是访问不了storage bucket的保证了数据隔离 但是…

这个小技巧真不错!

大家好&#xff0c;我是前端队长。前端程序员&#xff0c;2023年开始玩副业。玩过AI绘画&#xff0c;公众号爆文项目&#xff0c;累计变现五位数。 今天看到萌萌在陪伴群分享了我公众号次图封面显示不全的问题。 这里我分享设计师萌萌的方法&#xff0c;很简单&#xff0c;但是…

想要在浏览器中访问pdf内容,服务器器该如何配置

1、需要先放置PDF文件&#xff1a; 将你的PDF文件放置在服务器的某个目录下&#xff0c;例如/var/www/html/pdfs/。确保服务器有权限读取这个目录中的文件。 2、配置Nginx&#xff1a; 在Nginx的配置文件中为PDF文件添加一个location块。 server { listen 80; server_name…

为什么HubSpot可以干翻营销和销售副总裁?

本文纯属虚构&#xff0c;作为销售的人&#xff0c;看完惊出一身大汗绝对属于正常。建议您先准备一个大毛巾&#xff0c;等下看完肯定会出汗的。还有&#xff0c;别忘记睡前给自己倒满一杯红酒&#x1f377;&#xff0c;今晚会失眠的呢。 1. 为什么是Hubspot&#xff1f; 2. H…

make | ubuntu源码编译指定版本make

下载源码包&#xff1a;Index of /gnu/make # 解压 tar -zxvf cmake-xxx.tar.gzcd cmake-xxx# 编译配置 ./configure ./build.sh# 先用apt安装一个make apt update apt install make# 然后使用系统的make来编译指定版本的make make install# 这时已经生成了可执行程序make # 然…

C# SetWindowPos函数

在C#中&#xff0c;SetWindowPos函数用于设置窗口的位置和大小。 原型&#xff1a; [DllImport("user32.dll", SetLastError true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int …

金融知识分享系列之:KD指标

金融知识分享系列之&#xff1a;KD指标 一、KD指标二、KD指标计算三、KD指标原理四、KD指标应用 一、KD指标 KD信号提供入场的工具 名称&#xff1a;随机震荡指标参数&#xff1a;&#xff08;9,3,3&#xff09;组成&#xff1a;K线&#xff0c;D线&#xff0c;20轴&#xff0…

【Linux】传输层协议:TCP/UDP

目录 netstat pidof UDP协议 TCP协议 TCP协议段格式 TCP协议的相关机制 确认应答&#xff08;ACK&#xff09;机制 超时重传机制 连接管理机制 服务端状态转换 客户端状态转化 流量控制 流量控制常见问题&#xff1a; 滑动窗口 拥塞控制 延迟应答 面向字节流…

流畅的 Python 第二版(GPT 重译)(九)

第四部分&#xff1a;控制流 第十七章&#xff1a;迭代器、生成器和经典协程 当我在我的程序中看到模式时&#xff0c;我认为这是一个麻烦的迹象。程序的形状应该只反映它需要解决的问题。代码中的任何其他规律性对我来说都是一个迹象&#xff0c;至少对我来说&#xff0c;这表…

(day 14)JavaScript学习笔记(对象2)

概述 这是我的学习笔记&#xff0c;记录了JavaScript的学习过程。在写博客的时候我会尽量详尽的记录每个知识点。如果你完全没接触过JavaScript&#xff0c;那么这一系列的学习笔记可能会对你有所帮助。 今天继续学习对象&#xff0c;主要是this、getters和setters、原型&#…

vulhub中DNS域传送漏洞复现

DNS协议支持使用axfr类型的记录进行区域传送&#xff0c;用来解决主从同步的问题。如果管理员在配置DNS服务器的时候没有限制允许获取记录的来源&#xff0c;将会导致DNS域传送漏洞。 环境搭建 Vulhub使用Bind9来搭建dns服务器&#xff0c;但不代表只有Bind9支持AXFR记录。运行…

Power BI学习(数据可视化)

另一个也可以的工具是&#xff1a;Tableau 还有一个是&#xff1a;神策&#xff0c;主要是用于互联网的app的数据埋点 数据分析的过程&#xff1a; 数据源--数据清洗&#xff08;power query&#xff09;-构建指标 新建度量值&#xff08;power pivot&#xff09;-可视化&…

构建一个前端智能停车可视化系统

引言 随着城市化进程的加速&#xff0c;停车难问题日益突出。智能停车可视化系统通过实时展示停车场的车位信息&#xff0c;帮助用户快速找到空闲车位&#xff0c;提高停车效率。 目录 引言 一、系统设计 二、代码实现 1. 环境准备 2. 安装依赖 3. 创建停车场组件 4. 集…

能源新动力:移动电站行业洞察报告

在全球能源结构转型和灾害应急需求不断上升的背景下&#xff0c;移动电站作为一种新型的电力供应解决方案&#xff0c;正逐渐成为保障临时供电、支持灾难恢复、以及促进能源普及的关键技术。本报告旨在全面分析移动电站行业的发展现状、技术趋势、市场潜力及面临的挑战&#xf…

python与excel第三节

批量重命名多个工作簿的名称 import os file_path D:\\TEST\\python与excelfile_list os.listdir(file_path)# 给出工作簿名中包含的需要替换的旧关键字和新关键字old_book_name 订单new_book_name 产品print(修改前名称&#xff1a;,file_list)for i in file_list: #…

React—— props校验(非typescript校验类型)

非typescript环境下&#xff0c;当我们在封装组件的时候&#xff0c;接受props时传入的内容&#xff0c;需要做类型检测&#xff0c;那我们可以用props校验进行类型的检查。 props校验允许在创建组件的时候&#xff0c;就约定props的格式、类型等 实现步骤&#xff1a; 导入 …