当前位置: 首页 > article >正文

前端大文件上传(分片上传)与下载

文章目录

  • 一、问题
  • 二、思路
    • 1、选择文件
    • 2、校验文件是否符合规范
    • 3、文件切片上传
    • 4、分片上传注意点
    • 5、大文件下载

一、问题

日常业务中难免出现前端需要向后端传输大型文件的情况,这时单次的请求不能满足传输大文件的需求,就需要用到分片上传
业务需求为:用户可以上传小于20G的镜像文件,并进显示当前上传进度
前端:vue3.x+Element Plus组件+axios

二、思路

解决思路简单为前端选择文件后读取到文件的基本信息,包括:文件的大小、文件格式等信息,用于前端校验,校验完成后将文件进行切片并通过请求轮询把切片传递给后端

Vue的元素代码如下,主要借助el-upload组件:

<template>...<!-- 文件上传 --><el-upload:show-file-list="false"actionclass="mirror-upload":http-request="putinMirror"><button>上传环境镜像</button></el-upload>...<!-- 进度显示 --><el-progress:percentage="progress":indeterminate="true"/>...
</template>
<script setup>// 引入封装好的接口api,根据提供的接口文档自行封装即可import {// 普通get请求apicheckMirrorFileApi,// 普通post请求apiuploadShardFileApi,} from "@/assets/api/uploadApi.js"import { ref } from 'vue'// 文件输进度条const progress = ref(0)...
</script>

1、选择文件

配合组件选取需要上传的文件

/* 上传环境镜像 分片上传 */
const putinMirror = async (file) => {// 校验文件是否符合规范(注意这里的异步方法,因为调用了接口加上await,校验函数若不调用接口可以不写await,否则返回promise对象)if (await checkMirrorFile(file)) {// 文件相关信息let files = file.file// 从0开始的切片let shardIndex = 0// 调用切片方法uploadFile(files, shardIndex)}
}

2、校验文件是否符合规范

这一步可以根据需求来进行校验,这里需要通过接口校验当前服务器可用的磁盘容量来判断是否有足够的空间用于存放将要上传的文件

/* 校验上传镜像文件是否符合规范 */
const checkMirrorFile = async (file) => {// 校验文件格式是否正确,支持.acow2/.iso/.ovf/.zip/.tarlet fileType = file.file.name.split('.')if (fileType[fileType.length - 1] !== 'acow2' && fileType[fileType.length - 1] !== 'iso' && fileType[fileType.length - 1] !== 'ovf' && fileType[fileType.length - 1] !== 'zip' && fileType[fileType.length - 1] !== 'tar') {ElMessage.warning('文件格式错误,仅支持.acow2/.iso/.ovf/.zip/.tar')return false}// 校验文件大小是否满足let fileSize = file.file.size//文件大小是否超出20Gif (fileSize > 20 * 1024 * 1024 * 1024) {ElMessage.warning('上传文件大小不超过20G')return false}const res = await checkMirrorFileApi()if (res.code !== 200) {ElMessage.warning('暂时无法查看磁盘可用空间,请重试')return false}// 查看磁盘容量大小if (res.data.diskDevInfos && res.data.diskDevInfos.length > 0) {let saveSize = 0res.data.diskDevInfos.forEach(i => {// 磁盘空间赋值if (i.devName === '/dev/mapper/centos-root') {// 返回值为GB,转为字节BsaveSize = i.free * 1024 * 1024 * 1024}})// 上传的文件大小没有超出磁盘可用空间if (fileSize < saveSize) {return true} else {ElMessage.warning('文件大小超出磁盘可用空间容量')return false}} else {ElMessage.warning('文件大小超出磁盘可用空间容量')return false}
}

3、文件切片上传

校验完成后就可以进行文件的切片上传了,这里用的类似接口轮询的方式,每次携带一个切片信息给后端,后端接受到切片并返回成功状态码后再进行下一次切片的上传,代码如下:
当然这里后端没有过多的做切片的处理,可以通过前端使用多线程,或者不等接口响应成功就进行下一次传递切片的过程进行上传的提速,这里具体怎么实现看业务需求或者怎么配合上传。

/* 文件切片上传 */
const uploadFile = async (file, shardIndex, createTime, savePath, relativePath, timeMillis) => {// 文件名let name = file.name// 文件大小let size = file.size// 分片大小let shardSize = 1024 * 1024 * 5// 分片总数let shardTotal = Math.ceil(size / shardSize)if (shardIndex >= shardTotal) {isAlive.value = falseprogress.value = 100return}// 文件开始结束的位置let start = shardIndex * shardSizelet end = Math.min(start + shardSize, size)// 开始切割let packet = file.slice(start, end)let formData = new FormData()formData.append("file", packet)formData.append("fileName", name)formData.append("size", size)formData.append("shardIndex", shardIndex)formData.append("shardSize", shardSize)formData.append("shardTotal", shardTotal)// 下面这些值是后端组装切片时需要的,跟前端关系不大if (createTime) formData.append("createTime", createTime)if (savePath) formData.append("savePath", savePath)if (shardIndex < shardTotal) {// 进度条保留两位小数展示progress.value = ((shardIndex / shardTotal) * 100).toFixed(2) * 1const res = await uploadShardFileApi(formData)if (res.code !== 200) {ElMessage.error(res.msg)progress.value = 0return}if (res.msg == '上传成功' && res.data.fileName && res.data.filePath) {// 这里为所有切片上传成功后进行的操作...}shardIndex++uploadFile(file, shardIndex, res.data.createTime, res.data.savePath, res.data.relativePath, res.data.timeMillis)}
}

4、分片上传注意点

首先就是需要配置一下Nginx,我这里的每一个切片文件的大小为5MB,但是上传第一片的时候会报413的状态码,因为Nginx默认上传文件的大小是1M,所以叫运维或者后端同学改一下配置参数,保证文件传输时不会受到服务器的限制。

5、大文件下载

这里简单说一下业务中遇到的大文件下载,上述镜像文件上传之后是支持用户下载的,所以怎样处理20G文件的下载也是需要考虑的,我与后端小伙伴尝试过通过range推流的方式来处理大文件的下载,当下载时除了控制台能看到后一直在推流过来,界面上不会出现下载进度的窗口,而且当文件大小超过2G时会出现浏览器缓存不足导致推流的中断,这里没有系统研究具体原因
解决方法是后端直接将文件所存的地址返回给我,当然也可以通过Nginx配置访问到文件存储的位置也可以,前端则通过创建a标签的方式进行下载,这样可以直接调用到浏览器自带的下载直接显示出来当前文件下载的相关信息:下载进度、传输的速率和文件大小,用户体验更好,代码如下:

const downloadMirror = async (item) => {let t = {id: item.id,}const res = await downloadMirrorApi(t)if (res.headers["content-disposition"]) {let temp = res.headers["content-disposition"].split(";")[1].split("filename=")[1]let fileName = decodeURIComponent(temp)// 通过创建a标签实现文件下载let link = document.createElement('a')link.download = fileNamelink.style.display = 'none'link.href = res.data.msgdocument.body.appendChild(link)link.click()document.body.removeChild(link)} else {ElMessage({message: '该文件不存在',type: 'warning',})}
}

相关文章:

前端大文件上传(分片上传)与下载

文章目录 一、问题二、思路1、选择文件2、校验文件是否符合规范3、文件切片上传4、分片上传注意点5、大文件下载 一、问题 日常业务中难免出现前端需要向后端传输大型文件的情况&#xff0c;这时单次的请求不能满足传输大文件的需求&#xff0c;就需要用到分片上传 业务需求为…...

工业领域 - 离散工业与流程工业极简理解

离散工业 离散工业是指通过组装或加工离散的零部件来生产产品 离散工业生产的是可数的、独立的产品 离散工业的每个产品通常由多个部件组成&#xff0c;生产过程可以分解为多个独立的步骤 离散工业生产过程主要涉及组装和加工&#xff0c;组装是将多个零部件组装成最终产品&…...

一个使用Python和相关深度学习库(如`PyTorch`)实现GCN(图卷积网络)与PPO(近端策略优化)强化学习模型结合的详细代码示例

以下是一个使用Python和相关深度学习库&#xff08;如PyTorch&#xff09;实现GCN&#xff08;图卷积网络&#xff09;与PPO&#xff08;近端策略优化&#xff09;强化学习模型结合的详细代码示例。这个示例假设你在一个图环境中进行强化学习任务。 1. 安装必要的库 确保你已…...

【YOLOv8】YOLOv8改进系列(7)----替换主干网络之LSKNet

主页&#xff1a;HABUO&#x1f341;主页&#xff1a;HABUO &#x1f341;YOLOv8入门改进专栏&#x1f341; &#x1f341;如果再也不能见到你&#xff0c;祝你早安&#xff0c;午安&#xff0c;晚安&#x1f341; 【YOLOv8改进系列】&#xff1a; 【YOLOv8】YOLOv8结构解读…...

CCF CSP 第30次(2023.05)(1_仓库规划_C++)

CCF CSP 第30次&#xff08;2023.05&#xff09;&#xff08;1_仓库规划_C&#xff09; 题目描述&#xff1a;输入格式&#xff1a;输出格式&#xff1a;样例输入&#xff1a;样例输出&#xff1a;样例解释&#xff1a;子任务&#xff1a;解题思路&#xff1a;思路一&#xff1…...

【LangChain】理论及应用实战(7):LCEL

文章目录 一、LCEL简介二、LCEL示例2.1 一个简单的示例2.2 RAG Search 三、LCEL下核心组件&#xff08;PromptLLM&#xff09;的实现3.1 单链结构3.2 使用Runnables来连接多链结构3.2.1 连接多链3.2.2 多链执行与结果合并3.2.3 查询SQL 3.3 自定义输出解析器 四、LCEL添加Memor…...

Leetcode 刷题笔记1 单调栈part02

leetcode 42 接雨水 本题用双指针法更为浅显易懂 双指针法&#xff1a; class Solution:def trap(self, height: List[int]) -> int:leftheight, rightheight [0] * len(height), [0] * len(height)ans 0leftheight[0] height[0]for i in range(1, len(height)):lefth…...

ai本地化 部署常用Ollama软件

现在用最简单的方式介绍一下 Ollama 的作用和用法&#xff1a; Ollama 是什么&#xff1f; Ollama 是一个让你能在自己电脑上免费运行大型语言模型&#xff08;比如 Llama 3、Mistral 等&#xff09;的工具。 相当于你本地电脑上有一个类似 ChatGPT 的 AI&#xff0c;但完全…...

vllm部署QwQ32B(Q4_K_M)

vllm部署QwQ32B(Q4_K_M) Ollama是一个轻量级的开源LLM推理框架&#xff0c;注重简单易用和本地部署&#xff0c;而VLLM是一个专注于高效推理的开源大型语言模型推理引擎&#xff0c;适合开发者在实际应用中集成和使用。两者的主要区别在于Ollama更注重为用户提供多种模型选择和…...

VLLM:虚拟大型语言模型(Virtual Large Language Model)

VLLM&#xff1a;虚拟大型语言模型&#xff08;Virtual Large Language Model&#xff09; VLLM指的是一种基于云计算的大型语言模型的虚拟实现。它通常是指那些由多个服务器组成的分布式计算环境中的复杂机器学习模型&#xff0c;这些模型能够处理和理解大量的文本数据。VLLM的…...

企业内网监控软件的选型与应用:四款主流产品的深度剖析

在数字化办公的时代背景下&#xff0c;企业内部网络管理的重要性愈发显著。对于企业管理者而言&#xff0c;如何精准掌握员工工作状态&#xff0c;保障网络安全与工作效率&#xff0c;已成为亟待解决的关键问题。本文将深入剖析四款主流企业内网监控软件&#xff0c;探讨其功能…...

蓝桥杯省赛(2024)

问题描述 小蓝和朋友们在玩一个报数游戏。由于今年是 20242024 年&#xff0c;他们决定要从小到大轮流报出是 2020 或 2424 倍数的正整数。前 1010 个被报出的数是&#xff1a;20,24,40,48,60,72,80,96,100,12020,24,40,48,60,72,80,96,100,120。请问第 2024202420242024202420…...

Qt窗口控件之字体对话框QFontDialog

字体对话框QFontDialog QFontDialog 是 Qt 内置的字体对话框&#xff0c;用户能够在这里选择字体的样式、大小&#xff0c;设置加粗和下划线并将结果作为返回值返回。QFontDialog 最好使用其提供的静态函数实例化匿名对象&#xff0c;并获取返回值最为用户选择字体设置的结果。…...

Qt QML实现视频帧提取

## 前言 视频帧率&#xff08;Frame Rate&#xff09;是指视频播放时每秒显示的画面帧数&#xff0c;通常用fps&#xff08;Frames Per Second&#xff09;来表示。视频是由一系列静止的图像帧组成的&#xff0c;而视频帧率则决定了这些图像帧在单位时间内播放的速度。较高的视…...

网络性能指标

目录 时延 延迟抖动 丢包率 时延&#xff1a;数据传输的快慢&#xff0c;影响实时性。抖动&#xff1a;延迟的变化&#xff0c;影响稳定性。丢包率&#xff1a;数据丢失的比例&#xff0c;影响可靠性。 时延 定义&#xff1a;时延是指数据从发送端传输到接收端所需的时间&…...

在 Ubuntu 服务器上使用宝塔面板搭建博客

&#x1f4cc; 介绍 在本教程中&#xff0c;我们将介绍如何在 Ubuntu 服务器 上安装 宝塔面板&#xff0c;并使用 Nginx PHP MySQL 搭建一个博客&#xff08;如 WordPress&#xff09;。 主要步骤包括&#xff1a; 安装宝塔面板配置 Nginx PHP MySQL绑定域名与 SSL 证书…...

计算机组成与接口16

1.0的表示方法唯一的有补码&#xff0c;移码&#xff0c;ASCII码 2.可以多次编程的只读存储器是EPROM,掩膜式ROM 3.8259A芯片可设置成脉冲边沿触发方式&#xff1b;全嵌套方式&#xff1b;自动中断结束方式&#xff1b;特殊屏蔽方式 4.计算机系统中的总线按层次可以分为板级…...

有了大语言模型还需要 RAG 做什么

一、百炼平台简介 阿里云的百炼平台就像是一个超级智能的大厨房&#xff0c;专门为那些想要做出美味AI大餐的企业和个人厨师准备的。你不需要从头开始做每一道菜&#xff0c;因为这个厨房已经为你准备了很多预制食材&#xff08;预训练模型&#xff09;&#xff0c;你可以根据…...

【从0到1搞懂大模型】RNN基础(4)

先说几个常用的可以下载数据集的地方 平台&#xff1a;kaggle&#xff08;https://www.kaggle.com/datasets&#xff09; 和鲸社区&#xff08;https://www.heywhale.com/home&#xff09; 阿里天池&#xff08;https://tianchi.aliyun.com/&#xff09; 其他&#xff1a;海量公…...

【第K小数——可持久化权值线段树】

题目 代码 #include <bits/stdc.h> using namespace std;const int N 1e5 10;int a[N], b[N]; int n, m, len; int rt[N], idx; // idx 是点分配器struct node {int l, r;int s; } tr[N * 22];int getw(int x) {return lower_bound(b 1, b len 1, x) - b; }int bui…...

直流减速电机控制实验:Simulink应用层开发(1)

文章目录 1 阶段目标2 功能需求3 需求拆解及方案研究3.1 需求拆解3.2 按键指令识别3.3 电机状态转换3.4 脉宽及启停判断4 总结1 阶段目标 本文是《直流减速电机控制实验》的第三部分,会通过图文结合的方式,手把手带读者操作Simulink工具进行直流减速电机的应用层开发。 本章…...

本地部署Deep Seek-R1,搭建个人知识库——笔记

目录 一、本地部署 DeepSeek - R1 1&#xff1a;安装Ollama 2&#xff1a;部署DeepSeek - R1模型 3&#xff1a;安装Cherry Studio 二、构建私有知识库 一、本地部署 DeepSeek - R1 1&#xff1a;安装Ollama 1.打开Ollama下载安装 未科学上网&#xff0c;I 先打开迅雷再下…...

【软考-架构】5.3、IPv6-网络规划-网络存储-补充考点

✨资料&文章更新✨ GitHub地址&#xff1a;https://github.com/tyronczt/system_architect 文章目录 IPv6网络规划与设计建筑物综合布线系统PDS&#x1f4af;考试真题第一题第二题 磁盘冗余阵列网络存储技术其他考点&#x1f4af;考试真题第一题第二题 IPv6 网络规划与设计…...

fastapi+angular外卖系统

说明&#xff1a; fastapiangular外卖系统 1.美食分类&#xff08;粥&#xff0c;粉&#xff0c;面&#xff0c;炸鸡&#xff0c;炒菜&#xff0c;西餐&#xff0c;奶茶等等&#xff09; 2.商家列表 &#xff08;kfc&#xff0c;兰州拉面&#xff0c;湘菜馆&#xff0c;早餐店…...

Oracle静默安装方法

Web服务器上面的Linux一般是不会有图形界面的&#xff0c;所有通过图形界面来安装Linux的方式在没有图形界面的Linux上面是行不通的&#xff0c;我们要使用的安装方式叫做Linux的静默安装。即在没有图形界面的Linux上面安装。 1. 下载地址 http://www.oracle.com/technetwork…...

鸿蒙路由 HMRouter 配置及使用 三 全局拦截器使用

1、前期准备 简单封装一个用户首选项的工具类 import { preferences } from "kit.ArkData";// 用户首选项方法封装 export class Preferences {private myPreferences: preferences.Preferences | null null;// 初始化init(context: Context, options: preference…...

计算机视觉——深入理解卷积神经网络与使用卷积神经网络创建图像分类算法

引言 卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;简称 CNNs&#xff09;是一种深度学习架构&#xff0c;专门用于处理具有网格结构的数据&#xff0c;如图像、视频等。它们在计算机视觉领域取得了巨大成功&#xff0c;成为图像分类、目标检测、图像分…...

永磁同步电机无速度算法--拓展卡尔曼滤波器

一、原理介绍 以扩展卡尔曼滤波算法为基础&#xff0c;建立基于EKF算法的估算转子位置和转速的离散模型。 实时性是扩展卡尔曼滤波器的一种特征&#xff0c;所以它可实时跟踪系统的状态并进行有效的输出&#xff0c;同时&#xff0c;它可以减少干扰、抑制噪声&#xff0c;其效…...

电机控制常见面试问题(十五)

文章目录 一、电机气隙二、电气时间三.电机三环控制详解四.驱动板跳线意义 一、电机气隙 电机气隙是定子和转子之间的空隙&#xff0c;防止钉子转子运转时物理接触&#xff0c;此外&#xff0c;气隙是磁路的重要环节&#xff0c;磁场需通过气隙传递能量&#xff0c;但其较高的…...

a2字幕分享

1. 沟通communication Hey everybody Welcome to this A2 English listening practice video. You can use this video to practice your listening and comprehension as I speak. Before we start, remember to download the Listening Time podcast and become a member a…...