【vue3组件】【大文件上传】【断点续传】支持文件分块上传,能够在上传过程中暂停、继续上传的组件

一、概述

本示例实现了一个基于 Vue3 和 TypeScript 的断点上传功能。该功能支持文件分块上传,能够在上传过程中暂停、继续上传,并且支持检测已经上传的分块,避免重复上传,提升上传效率。以下是关键的技术点与实现流程:

  • 文件分块:将大文件分成多个小块,每块的大小是固定的(例如 5MB)。
  • 上传进度:通过进度条显示文件上传的进度。
  • 断点续传:支持暂停和继续上传,避免上传过程中断导致的文件重新上传。
  • 文件哈希:通过计算文件的哈希值来唯一标识文件,并检查文件是否已经上传完成。

二、实现步骤

(一)定义状态变量

通过 ref 定义一些响应式状态变量来管理文件、进度、上传状态等信息:

const file = ref<File | null>(null);
const fileHash = ref<string>('');
const chunkSize = 5 * 1024 * 1024; // 每个分块大小(5MB)
const uploadedChunks = ref<number[]>([]); // 已上传的分块索引
const progress = ref<number>(0); // 上传进度
const paused = ref<boolean>(false); // 上传是否暂停
const uploading = ref<boolean>(false); // 是否正在上传

(二)监听文件选择并计算哈希

当用户选择文件后,计算该文件的 SHA-256 哈希值,哈希值用来判断文件是否已经上传过。

const onFileChange = (event: Event) => {const target = event.target as HTMLInputElement;file.value = target.files?.[0] || null;if (file.value) {calculateFileHash();}
};const calculateFileHash = async () => {if (!file.value) return;const buffer = await file.value.arrayBuffer();const hashBuffer = await crypto.subtle.digest('SHA-256', buffer);fileHash.value = [...new Uint8Array(hashBuffer)].map((b) => b.toString(16).padStart(2, '0')).join('');await checkUploadedChunks();
};

(三)检查已上传的分块

调用后端接口检查文件的部分分块是否已经上传,以避免重复上传。

const checkUploadedChunks = async () => {try {const response = await axios.get(getUploadedChunksApi.value, {params: { fileHash: fileHash.value },});if (response.data.uploadedChunks === 'completed') {alert('文件已上传完成!');progress.value = 100; // 设置进度为 100%return true; // 文件已完成上传}uploadedChunks.value = response.data.uploadedChunks || [];return false; // 文件未完成上传} catch (error) {console.error('Error checking uploaded chunks:', error);return false;}
};

(四)开始上传

分块上传文件。上传时检查哪些分块已经上传,跳过已上传的分块。如果上传中出现错误,可以暂停上传。

const startUpload = async () => {if (!file.value) return;paused.value = false;uploading.value = true;const isCompleted = await checkUploadedChunks();if (isCompleted) {uploading.value = false;return;}const totalChunks = Math.ceil(file.value.size / chunkSize);for (let i = 0; i < totalChunks; i++) {if (paused.value) break;if (uploadedChunks.value.includes(i)) {progress.value = ((i + 1) / totalChunks) * 100;continue;}const chunk = file.value.slice(i * chunkSize, (i + 1) * chunkSize);const formData = new FormData();formData.append('file', chunk);formData.append('chunkIndex', i.toString());formData.append('fileHash', fileHash.value);formData.append('totalChunks', totalChunks.toString());try {await axios.post(uploadChunkApi.value, formData);uploadedChunks.value.push(i);progress.value = ((i + 1) / totalChunks) * 100;} catch (error) {console.error('Error uploading chunk:', error);paused.value = true;break;}}if (!paused.value && progress.value === 100) {completeUpload();}uploading.value = false;
};

(五)暂停与继续上传

提供暂停与继续上传的功能,通过控制 paused 变量来实现。

const pauseUpload = () => {paused.value = true;uploading.value = false;
};const resumeUpload = () => {paused.value = false;startUpload();
};

(六)合并分块

所有分块上传完成后,通过后端接口提交合并请求,合并文件。

const completeUpload = async () => {try {await axios.post(completeUploadApi.value, {fileHash: fileHash.value,fileExtension: file.value?.name.split('.').pop(),fileName: file.value?.name,});alert('文件上传完成!');} catch (error) {console.error('Error completing upload:', error);}
};

三、模板部分

<template><div class="upload"><h2>断点上传</h2><input type="file" @change="onFileChange" /><div v-if="file"><p>文件名: {{ file.name }}</p><p>文件大小: {{ (file.size / 1024 / 1024).toFixed(2) }} MB</p><progress :value="progress" max="100"></progress><div class="actions"><button @click="startUpload" :disabled="uploading">开始上传</button><button @click="pauseUpload" :disabled="!uploading">暂停上传</button><button @click="resumeUpload" :disabled="uploading || !paused">继续上传</button></div></div></div>
</template>

四、样式部分

<style scoped>
.upload {width: 400px;margin: 20px auto;
}.actions {margin-top: 10px;
}button {margin-right: 10px;
}progress {width: 100%;height: 20px;margin-top: 10px;
}
</style>

五、总结

通过以上的实现,我们可以完成一个支持断点续传和分块上传的功能。该方案不仅提升了大文件上传的效率,还避免了上传过程中断的影响。通过 Vue3 与 TypeScript 的结合,实现了清晰的状态管理和组件化的文件上传逻辑,便于后续的维护和扩展。

该功能组件已在github开源(对应后端也已开源)在apps\web-ele\src\views\test\test5\index.vue

🌐 前端项目 Vue3-components

已在 GitHub 开源:Vue3-components

项目概述:
基于最新技术栈 Vue3 + Vite + TypeScript,采用 vben 开源的后端管理系统,前后端完美衔接,为您的开发提供高效且现代的解决方案。

主要特点:

  • Vue3 + Vite + TypeScript:基于前沿技术开发,提升开发效率和性能。
  • 多套主题支持:提供可配置的主题系统,让应用界面与品牌风格完美匹配。
  • 内置国际化:支持多语言,满足全球化需求。
  • 动态路由权限生成:内置动态权限管理和路由生成方案,实现细粒度的权限控制。

功能亮点:

  • 快速集成 Django 后端,轻松调用 Django-DRF-components 系列功能
  • websockt、sse示例
  • 大文件断点续传
  • 强大的文件管理系统,支持文件上传和下载
  • 高度可定制的界面和功能模块

🚀 Django封装高复用高可移植的apps系列 - 快速集成与高效开发!

已在 GitHub 开源:Django-DRF-components

特点:

  • 高复用性:每个组件都经过精心设计,确保可在不同项目中无缝使用。
  • 高可移植性:简单集成,快速实现所需功能,节省开发时间。
  • 灵活扩展:可根据需求轻松定制和扩展。
  • 功能完备:包括常见的上传功能、文件管理、用户认证等多种实用功能,满足各种开发需求。

🔧 涵盖功能:

  • 文件上传(普通、分块上传)
  • 用户认证(RBAC)
  • JWT认证app
  • 邮箱登录、验证、重置密码
  • 导出Excel、PDF
  • 封装通用views类
  • SSE(服务器推送事件)
  • WebSocket
  • 文件管理与存储
  • 多种常见工具集(如权限验证、数据处理等)

开源优点:

  • 快速启动、低门槛接入
  • 大量实用的模板与示例代码
  • 高效的文档支持与社区维护

立即访问 GitHub,开始使用前后端完美结合的 Django 与 Vue3 项目,提升开发效率和应用性能!【查看代码(后端)】【查看代码(前端)】


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

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

相关文章

hexo + Butterfly搭建博客

Hexo‌是一个基于Node.js的静态网站生成器&#xff0c;主要用于快速搭建博客和个人网站。它使用Markdown语法编写文章&#xff0c;能够迅速生成静态页面并部署到服务器上。 配置node 使用nvm安装node(v16.13.2)后配置镜像 安装并使用node&#xff1a; nvm install 16.13.2 n…

手撕B-树

一、概述 1.历史 B树&#xff08;B-Tree&#xff09;结构是一种高效存储和查询数据的方法&#xff0c;它的历史可以追溯到1970年代早期。B树的发明人Rudolf Bayer和Edward M. McCreight分别发表了一篇论文介绍了B树。这篇论文是1972年发表于《ACM Transactions on Database S…

【2025年数学建模美赛F题】(顶刊论文绘图)模型代码+论文

全球网络犯罪与网络安全政策的多维度分析及效能评估 摘要1 Introduction1.1 Problem Background1.2Restatement of the Problem1.3 Literature Review1.4 Our Work 2 Assumptions and Justifications数据完整性与可靠性假设&#xff1a;法律政策独立性假设&#xff1a;人口统计…

【FreeRTOS 教程 四】队列创建与发布项目到队列

目录 一、FreeRTOS队列&#xff1a; &#xff08;1&#xff09;队列介绍&#xff1a; &#xff08;2&#xff09;用户模型说明&#xff1a; &#xff08;3&#xff09;阻塞队列&#xff1a; 二、队列管理 API&#xff1a; &#xff08;1&#xff09;uxQueueMessagesWaiti…

如何在data.table中处理缺失值

&#x1f4ca;&#x1f4bb;【R语言进阶】轻松搞定缺失值&#xff0c;让数据清洗更高效&#xff01; &#x1f44b; 大家好呀&#xff01;今天我要和大家分享一个超实用的R语言技巧——如何在data.table中处理缺失值&#xff0c;并且提供了一个自定义函数calculate_missing_va…

基于OpenCV实现的答题卡自动判卷系统

一、图像预处理 🌄 二、查找答题卡轮廓 📏 三、透视变换 🔄 四、判卷与评分 🎯 五、主函数 六、完整代码+测试图像集 总结 🌟 在这篇博客中,我将分享如何使用Python结合OpenCV库开发一个答题卡自动判卷系统。这个系统能够自动从扫描的答题卡中提取信…

C++ list 容器用法

C list 容器用法 C 标准库提供了丰富的功能&#xff0c;其中 <list> 是一个非常重要的容器类&#xff0c;用于存储元素集合&#xff0c;支持双向迭代器。<list> 是 C 标准模板库&#xff08;STL&#xff09;中的一个序列容器&#xff0c;它允许在容器的任意位置快速…

docker部署jenkins

环境&#xff1a; centos7.9 jenkins/jenkins:lts-jdk11 1、拉去jenkins镜像&#xff0c;请指明版本号 [rootlocalhost ~]# docker pull jenkins/jenkins:lts 开始拉取 拉取完成 [rootlocalhost ~]# docker pull jenkins/jenkins:lts lts: Pulling from jenkins/jenkins 0a9…

沃尔玛 礼品卡绑定 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向分析 部分代码参考 func doPost…

【2024年华为OD机试】 (A卷,100分)- 整理扑克牌(JavaScriptJava PythonC/C++)

一、问题描述 题目描述 给定一组数字,表示扑克牌的牌面数字,忽略扑克牌的花色,请按如下规则对这一组扑克牌进行整理: 步骤1:分组形成组合牌 炸弹:当牌面数字相同张数大于等于4时。葫芦:3张相同牌面数字 + 2张相同牌面数字,且3张牌与2张牌不相同。三张:3张相同牌面数…

Arduino大师练成手册 --控制 OLED

要在 Arduino 上使用 U8glib 库控制带有 7 个引脚的 SPI OLED 显示屏&#xff0c;你可以按照以下步骤进行&#xff1a; 7pin OLED硬件连接 GND&#xff1a;连接到 Arduino 的 GND 引脚。 VCC&#xff1a;连接到 Arduino 的 5V 引脚。 D0&#xff08;或 SCK/CLK&#xff09;…

单片机基础模块学习——按键

一、按键原理图 当把跳线帽J5放在右侧&#xff0c;属于独立按键模式&#xff08;BTN模式&#xff09;&#xff0c;放在左侧为矩阵键盘模式&#xff08;KBD模式&#xff09; 整体结构是一端接地&#xff0c;一端接控制引脚 之前提到的都是使用了GPIO-准双向口的输出功能&#x…

AWScurl笔记

摘要 AWScurl是一款专为与AWS服务交互设计的命令行工具&#xff0c;它模拟了curl的功能并添加了AWS签名版本4的支持。这一特性使得用户能够安全有效地执行带有AWS签名的请求&#xff0c;极大地提升了与AWS服务交互时的安全性和有效性。 GitHub - okigan/awscurl: curl-like acc…

初识MySQL

文章目录 1.数据库2.查看数据库3.创建数据库4.字符集编码和排序规则6.修改数据库7.删除数据库 1.数据库 MySQL是一款使用率高且免费的数据库&#xff08;使用率仅仅低于Oracle&#xff09; 关系数据库和 NoSQL 数据库管理系统知识库(DB-Engines Ranking -) (此图数据于2025-1…

flutter_学习记录_00_环境搭建

1.参考文档 Mac端Flutter的环境配置看这一篇就够了 flutter的中文官方文档 2. 本人环境搭建的背景 本人的电脑的是Mac的&#xff0c;iOS开发&#xff0c;所以iOS开发环境本身是可用的&#xff1b;外加Mac电脑本身就会配置Java的环境。所以&#xff0c;后面剩下的就是&#x…

[b01lers2020]Life on Mars1

打开题目页面如下 看了旁边的链接&#xff0c;也没有什么注入点&#xff0c;是正常的科普 利用burp suite抓包&#xff0c;发现传参 访问一下 http://5edaec92-dd87-4fec-b0e3-501ff24d3650.node5.buuoj.cn:81/query?searchtharsis_rise 接下来进行sql注入 方法一&#xf…

【PyTorch】3.张量类型转换

个人主页&#xff1a;Icomi 在深度学习蓬勃发展的当下&#xff0c;PyTorch 是不可或缺的工具。它作为强大的深度学习框架&#xff0c;为构建和训练神经网络提供了高效且灵活的平台。神经网络作为人工智能的核心技术&#xff0c;能够处理复杂的数据模式。通过 PyTorch&#xff0…

机位:解锁摄影视角的多维度密码

目录 一、机位的构成要素 &#xff08;一&#xff09;高度维度 &#xff08;二&#xff09;角度维度 &#xff08;三&#xff09;距离维度 二、移动机位的魅力 &#xff08;一&#xff09;推镜头 &#xff08;二&#xff09;拉镜头 &#xff08;三&#xff09;摇镜头 …

【例51.3】 平移数据

题目描述 将a数组中第一个元素移到数组末尾,其余数据依次往前平移一个位置。 输入 第一行为数组a的元素个数&#xff1b; 第二行为n个小于1000的正整数。 输出 平移后的数组元素&#xff0c;每个数用一个空格隔开。 样例输入 复制 10 1 2 3 4 5 6 7 8 9 10 样例输出 复…

【Project】CupFox电影网站数据爬取分析与可视化

数据采集清洗与数据存储流程如下图所示。 数据分析与数据可视化流程设计如下 1.使用pymongo从数据库中查询所需的数据。对数据进行处理和分析&#xff0c;进行统计、分类、聚合等操作&#xff0c;提取关键指标和洞察。分析结果可以通过编写Python代码进一步优化、筛选和整理&a…