【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.mzph.cn/pingmian/68324.shtml

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

相关文章

OpenCV 版本不兼容导致的问题

问题和解决方案 今天运行如下代码&#xff0c;发生了意外的错误&#xff0c;代码如下&#xff0c;其中输入的 frame 来自于 OpenCV 开启数据流的读取 """ cap cv2.VideoCapture(RTSP_URL) print("链接视频流完成") while True:ret, frame cap.rea…

Day25-【13003】短文,什么是算法?如何衡量时间复杂度?什么是最优,平均时间复杂度?

文章目录 第二节概览什么是算法&#xff1f;算法的5个特性&#xff1f; 算法如何评估&#xff1f;时间指标如何衡量&#xff1f;算法的复杂度如何度量&#xff1f;算法开销上限和下限如何表示&#xff1f;什么是常数复杂度&#xff1f;线性操作&#xff1f;对数复杂度-线性对数…

python基础语法(3) -------- 学习笔记分享

目录: 1. 函数 1.1 语法格式 1.2 函数参数 1.3 函数返回值 1.4 变量的作用域 1.5 函数的执行过程 1.6 函数的链式调用 1.7 函数的嵌套调用 1.8 函数递归 1.9 参数默认值 1.10 函数的关键字传参 2. 列表和元组 2.1 列表和元组是啥 2.2 创建列表 2.3 访问下标 2.…

磐维数据库PanWeiDB2.0日常维护

磐维数据库简介 “中国移动磐维数据库”&#xff08;ChinaMobileDB&#xff09;&#xff0c;简称“磐维数据库”&#xff08;PanWeiDB&#xff09;。是中国移动信息技术中心首个基于中国本土开源数据库打造的面向ICT基础设施的自研数据库产品。 其产品内核能力基于华为 OpenG…

Linux:文件与fd(未被打开的文件)

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《Linux&#xff1a;文件与fd&#xff08;未被打开的文件&#xff09;》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 如果本篇文章对你有帮助&#xf…

传输层协议TCP与UDP:深入解析与对比

传输层协议TCP与UDP&#xff1a;深入解析与对比 目录 传输层协议TCP与UDP&#xff1a;深入解析与对比引言1. 传输层协议概述2. TCP协议详解2.1 TCP的特点2.2 TCP的三次握手与四次挥手三次握手四次挥手 2.3 TCP的流量控制与拥塞控制2.4 TCP的可靠性机制 3. UDP协议详解3.1 UDP的…

自动驾驶中的多传感器时间同步

目录 前言 1.多传感器时间特点 2.统一时钟源 2.1 时钟源 2.2 PPSGPRMC 2.3 PTP 2.4 全域架构时间同步方案 3.时间戳误差 3.1 硬件同步 3.2 软件同步 3.2.3 其他方式 ① ROS 中的 message_filters 包 ② 双端队列 std::deque 参考&#xff1a; 前言 对多传感器数据…

U-Net - U型网络:用于图像分割的卷积神经网络

U-Net是一种专为图像分割任务设计的卷积神经网络&#xff08;CNN&#xff09;&#xff0c;最初由Olaf Ronneberger等人于2015年提出。它被广泛应用于医学影像分析、遥感图像分割、自动驾驶和其他许多需要对图像进行像素级分类的任务中。U-Net具有强大的特征提取和恢复能力&…

c++小知识点

抽象类包含至少一个纯虚函数&#xff0c;不能实例化对象。派生类必须实现基类的所有纯虚函数才能成为非抽象类&#xff0c;从而可以实例化对象。可以使用抽象类的指针或引用指向派生类对象&#xff0c;实现多态性调用。抽象类虽然不能直接实例化&#xff0c;但可以拥有构造函数…

关于使用PHP时WordPress排错——“这意味着您在wp-config.php文件中指定的用户名和密码信息不正确”的解决办法

本来是看到一位好友的自己建站&#xff0c;所以突发奇想&#xff0c;在本地装个WordPress玩玩吧&#xff0c;就尝试着装了一下&#xff0c;因为之前电脑上就有MySQL&#xff0c;所以在自己使用PHP建立MySQL时报错了。 最开始是我的php启动mysql时有问题&#xff0c;也就是启动过…

写一个存储“网站”的网站前的分析

要创建一个能够存储自己网站内容的“网站”,通常意味着你希望有一个可以存储网站数据、文件、内容等信息的系统。为了实现这一目标,可以考虑构建一个内容管理系统(CMS),这个系统能够帮助你存储和管理网站上的内容。 图片仅供参考 以下是如何实现一个可以存储自己网站内容…

[STM32 标准库]定时器输出PWM配置流程 PWM模式解析

前言&#xff1a; 本文内容基本来自江协&#xff0c;整理起来方便日后开发使用。MCU&#xff1a;STM32F103C8T6。 一、配置流程 1、开启GPIO&#xff0c;TIM的时钟 /*开启时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启TIM2的时钟RCC_APB2PeriphClockC…

Vue.js组件开发-实现对视频预览

在 Vue 中实现视频文件预览 实现步骤 创建 Vue 组件&#xff1a;构建一个 Vue 组件用于处理视频文件的选择和预览。文件选择&#xff1a;添加一个文件输入框&#xff0c;允许用户选择视频文件。读取文件&#xff1a;监听文件选择事件&#xff0c;使用 FileReader API 读取所选…

深入探索 Vue 3 Markdown 编辑器:高级功能与实现

目录 1. 为什么选择 Markdown 编辑器&#xff1f;2. 选择合适的 Markdown 编辑器3. 安装与基本配置安装 配置 Markdown 编辑器代码说明 4. 高级功能实现4.1 实时预览与双向绑定4.2 插入图片和图像上传安装图像上传插件配置图像上传插件 4.3 数学公式支持安装 KaTeX配置 KaTeX 插…

【信息系统项目管理师-选择真题】2015下半年综合知识答案和详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20题】【第…

KIMI K1.5:用大语言模型扩展强化学习(论文翻译)

文章目录 KIMI K1.5技术报告摘要 1. 引言2. 方法&#xff1a;基于大语言模型的强化学习2.1 强化学习提示集整理2.2 长思维链监督微调2.3 强化学习2.3.1 问题设定2.3.2 策略优化2.3.3 长度惩罚2.3.4 采样策略2.3.5 训练方法的更多细节 2.4 长到短&#xff1a;短思维链模型的上下…

python:taichi 高性能可视化 Demo 展览

安装 pip install taichi taichi-1.7.3-cp39-cp39-win_amd64.whl (83.1 MB) 运行 cmd where ti D:\Python39\Scripts\ti.exe #-- taichi 高性能可视化 Demo 展览 ti gallery [Taichi] version 1.7.3, llvm 15.0.1, commit 5ec301be, win, python 3.9.13********************…

API接口设计模板

API 员工登录接口设计 基本信息 Path&#xff1a; /admin/staff/login **Method&#xff1a;**POST 接口描述&#xff1a; 请求参数 Query 参数名称是否必须示例备注username是admin用户名password是mima密码 返回数据 名称类型是否必须默认值备注其他信息codeinteger必须dat…

电脑无法开机,重装系统后没有驱动且驱动安装失败

电脑无法开机&#xff0c;重装系统后没有驱动且驱动安装失败 前几天电脑突然坏了&#xff0c;电脑卡住后&#xff0c;强制关机&#xff0c;再开机后开机马上就关机。尝试无数次开机后失败&#xff0c;进入BIOS界面&#xff0c;发现已经没有Windows系统了。重新安装系统后&…

2024年度总结——理想的风,吹进现实

2024年悄然过去&#xff0c;留下了太多美好的回忆&#xff0c;不得不感慨一声时间过得真快啊&#xff01;旧年风雪尽&#xff0c;新岁星河明。写下这篇博客&#xff0c;记录我独一无二的2024年。这一年&#xff0c;理想的风终于吹进现实&#xff01; 如果用一句话总结这一年&am…