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

大文件秒传,分片上传,断点续传

大文件分片上传

一 功能描述

1.文件通过web端分片多线程上传到服务端,然后web端发起分片合并,完成大文件分片上传功能

2.上传过的大文件,实现秒传

3.上传过程中,服务异常退出,实现断点续传

二 流程图

在这里插入图片描述

三 代码运行展示

1.分片上传

在这里插入图片描述

2.秒传

在这里插入图片描述

3.断点续传

在这里插入图片描述
在这里插入图片描述

四 代码结构

在这里插入图片描述

五 技术栈

1.springboot
2.aws存储
3.mysql

六 代码片段

 @ApiOperation(value = "大文件上传")@PostMapping(value = "/big/upload",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)public RestResp<String> uploadChunk(HttpServletRequest request,BigFileChunkFo bigFileChunkFo, MultipartFile file) {log.debug("分片上传参数:{}",bigFileChunkFo);String result = fileManager.uploadChunk(request,bigFileChunkFo,file);return RestResp.success(result);}@ApiOperation(value = "检查是否上传")@PostMapping("/big/checkMd5")public RestResp<BigFileCheckDto> checkMd5(HttpServletRequest request,@RequestBody BigFileCheckFo fileCheckFo) {BigFileCheckDto bigFileCheckDto = fileManager.checkMd5(request,fileCheckFo);return RestResp.success(bigFileCheckDto);}@ApiOperation(value = "大文件合并")@PostMapping("/big/merge")public RestResp<String> merge(HttpServletRequest request,@RequestBody BigFileMergeFo bigFileMergeFo) {log.debug("文件合并:{}",bigFileMergeFo);String result = fileManager.merge(request,bigFileMergeFo);return RestResp.success(result);}
    @Overridepublic String copyFile(String bucketName, String sourceFileKey, String targetFileKey) throws Exception {log.info("bucketName:{},sourceFileKey:{},targetFileKey:{}",bucketName,sourceFileKey,targetFileKey);CopyObjectRequest copyObjectRequest = new CopyObjectRequest();copyObjectRequest.setSourceBucketName(bucketName);copyObjectRequest.setDestinationBucketName(bucketName);copyObjectRequest.setSourceKey(sourceFileKey);copyObjectRequest.setDestinationKey(targetFileKey);getClient().copyObject(copyObjectRequest);return this.getObjectPrefixUrl(bucketName) +  targetFileKey;
}/*** 上传分片** @param bigFileChunkFo* @return* @throws Exception*/@Overridepublic PartETag uploadChunk(BigFileChunkFo bigFileChunkFo, BigFile bigFile, MultipartFile multipartFile) throws Exception {//桶名String bucketName = bigFileChunkFo.getBucketName();//当前分片int chunkNum = bigFileChunkFo.getChunkNum();//当前分片大小long chunkSize = bigFileChunkFo.getChunkSize();// 上传ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(IOUtils.toByteArray(multipartFile.getInputStream()));UploadPartRequest uploadRequest = new UploadPartRequest().withBucketName(bucketName).withKey(bigFile.getFileKey()).withUploadId(bigFile.getUploadId()).withInputStream(byteArrayInputStream).withPartNumber(chunkNum).withPartSize(chunkSize);UploadPartResult uploadResult = getClient().uploadPart(uploadRequest);return uploadResult.getPartETag();}/*** 获取上传任务id** @param bigFileCheckFo* @param fileKey* @return*/@Overridepublic String getUploadId(BigFileCheckFo bigFileCheckFo, String fileKey) {String bucketName = bigFileCheckFo.getBucketName();InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(bucketName, fileKey);log.info("initRequest:{}", initRequest);InitiateMultipartUploadResult initResponse = getClient().initiateMultipartUpload(initRequest);return initResponse.getUploadId();}/*** 大文件合并** @param bigFile* @param bigFileChunkList* @return* @throws Exception*/@Overridepublic String merge(BigFile bigFile, List<BigFileChunk> bigFileChunkList) throws Exception {String bucketName = bigFile.getBucketName();List<PartETag> partETagList = bigFileChunkList.stream().map(bigFileChunk -> new PartETag(bigFileChunk.getChunkNum(), bigFileChunk.getETag())).collect(Collectors.toList());CompleteMultipartUploadRequest compRequest = new CompleteMultipartUploadRequest(bucketName, bigFile.getFileKey(),bigFile.getUploadId(), partETagList);log.info("compRequest:{}", compRequest);getClient().completeMultipartUpload(compRequest);return this.getObjectPrefixUrl(bucketName) + bigFile.getFileKey();}

七 表设计

CREATE TABLE `hfle_big_file` (`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',`md5` varchar(128) COLLATE utf8mb4_general_ci NOT NULL COMMENT '文件MD5',`status` int NOT NULL DEFAULT '1' COMMENT '上传状态,1:上传中;2:上传完成',`access_key` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT 'accessKey',`chunk_count` bigint DEFAULT NULL COMMENT '分片总数',`file_name` varchar(240) COLLATE utf8mb4_general_ci NOT NULL COMMENT '文件名称',`file_size` bigint DEFAULT NULL COMMENT '文件大小',`bucket_name` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '上传桶',`file_type` varchar(128) COLLATE utf8mb4_general_ci NOT NULL COMMENT '文件类型',`file_key` varchar(128) COLLATE utf8mb4_general_ci NOT NULL COMMENT '文件唯一值',`url` varchar(256) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '上传地址',`upload_id` varchar(128) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 's3上传任务id',`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`creator` bigint NOT NULL DEFAULT '-1' COMMENT '创建人',`modifier` bigint NOT NULL DEFAULT '-1' COMMENT '最后更新人',`modified_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`) USING BTREE,UNIQUE KEY `uniq_md5_access_key` (`access_key`, `md5`, `bucket_name`, `file_key`)
) ENGINE = InnoDB AUTO_INCREMENT = 47 DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '大文件上传记录表';CREATE TABLE `hfle_big_chunck` (`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',`big_file_id` bigint DEFAULT NULL COMMENT '大文件id',`chunk_num` bigint DEFAULT NULL COMMENT '当前分片',`e_tag` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 's3上传专用',`chunk_size` bigint DEFAULT NULL COMMENT '分片大小',`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`creator` bigint NOT NULL DEFAULT '-1' COMMENT '创建人',`modifier` bigint NOT NULL DEFAULT '-1' COMMENT '最后更新人',`modified_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`) USING BTREE,UNIQUE KEY `uniq_chunk_num` (`big_file_id`, `chunk_num`)
) ENGINE = InnoDB AUTO_INCREMENT = 1542 DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '大文件上传分片记录表'

八 启动访问地址

http://localhost:9999

九 源代码下载

源码下载

相关文章:

大文件秒传,分片上传,断点续传

大文件分片上传 一 功能描述 1.文件通过web端分片多线程上传到服务端&#xff0c;然后web端发起分片合并&#xff0c;完成大文件分片上传功能 2.上传过的大文件&#xff0c;实现秒传 3.上传过程中&#xff0c;服务异常退出&#xff0c;实现断点续传 二 流程图 三 代码运行…...

多生境扩增子探秘:深度溯源与多样性解析

分析微生物组数据的组成结构的一个主要挑战是确定其潜在来源。在微生物来源分析中&#xff0c;随机森林、SourceTracker和FEAST都有较广泛应用。今天&#xff0c;小编就带大家看一篇发表在《iMeta》的文章&#xff0c;使用溯源技术追踪微生物的来源与去向&#xff0c;揭示生物在…...

Selenium4自动化测试常用函数总结,各种场景操作实战

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 seleninum作为自动化测试的工具&#xff0c;自然是提供了很多自动化操作的函数&#xff0c;下面列举下比较常用的函数&#xff0c;更多可见官方文档&#xff1a;…...

图像生成新范式:智源推出全能视觉生成模型 OmniGen

大型语言模型&#xff08;LLM&#xff09;的出现统一了语言生成任务&#xff0c;并彻底改变了人机交互。然而&#xff0c;在图像生成领域&#xff0c;能够在单一框架内处理各种任务的统一模型在很大程度上仍未得到探索。近日&#xff0c;智源推出了新的扩散模型架构 OmniGen&am…...

实现RPC接口的demo记录

1.Thrift RPC 接口实现 Demo Service public class DemoServiceImpl implements DemoService.Iface {private static final Logger logger LoggerFactory.getLogger(DemoServiceImpl.class);Overridepublic String sayHello(Context context, String msg) throws TException …...

Python期末题目 | 期末练习题【概念题+代码】

一、前言 Python 是一门功能强大且易于学习的编程语言&#xff0c;在高校中被广泛用作教学语言。Python 的期末考试通常会包含基础知识和编程实践&#xff0c;以考察学生的理解与应用能力。本文整理了一套 Python 期末练习题&#xff0c;包括选择题、填空题、判断题和代码题。…...

OpenCV基本操作(python开发)——(6)视频基本处理

OpenCV——视频基本处理 一、读取摄像头 import numpy as np import cv2cap cv2.VideoCapture(0) # 实例化VideoCapture对象, 0表示第一个摄像头 while cap.isOpened():ret, frame cap.read() # 捕获帧cv2.imshow("frame", frame)c cv2.waitKey(1) # 等待1毫…...

详解Java之Spring MVC篇一

目录 Spring MVC 官方介绍 MVC RequestMapping 传递参数 无参数 单个参数 针对String类型 针对Integer类型 针对int类型 针对自定义类型 多个参数 参数重命名 参数强制一致 参数不强制一致 传递数组 ​编辑传递List ​编辑 传递JSON ​编辑 从路径中获取参…...

ubuntu20.04上使用 Verdaccio 搭建 npm 私有仓库

安装nvm 首先安装必要的工具&#xff1a; apt update apt install curl下载并执行nvm安装脚本&#xff1a; curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash添加环境变量&#xff08;如果安装脚本没有自动添加&#xff09;。编辑 ~/.bash…...

Python实现办公自动化的数据可视化与报表生成

在 Python 中&#xff0c;可以利用多个库来实现办公自动化中的数据可视化与报表生成。以下是具体的方法&#xff1a; 一、数据可视化 使用 matplotlib 库 matplotlib 是一个强大的 Python 绘图库&#xff0c;可以创建各种类型的静态、动态和交互式图表。示例代码&#xff1a;i…...

前端知识串联笔记(更新中...)

1.MVVM MVVM 是指 Model - View - ViewModel&#xff0c;Model 是数据与业务逻辑&#xff0c;View 是视图&#xff0c;ViewModel 用于连接 View 和 Model Model ---> View&#xff1a;将数据转化成所看到的页面&#xff0c;实现的方式&#xff1a;Data Bindings -- 数据绑定…...

PostgreSQL根据字符串的长度排序

PostgreSQL根据字符串的长度排序 在 PostgreSQL 中&#xff0c;你可以使用 LENGTH 函数来获取字符串的长度&#xff0c;并根据这个长度进行排序。LENGTH 函数会返回字符串的字符数。 以下是一个基本的 SQL 查询示例&#xff0c;它根据 some_column 字符串列的长度对表中的行进…...

计算机网络:网络层 —— IP数据报的发送和转发过程

文章目录 IP数据报的发送和转发过程主机发送IP数据报路由器转发IP数据报示例 IP数据报的发送和转发过程 IP 数据报的发送和转发过程包含以下两个过程&#xff1a; 主机发送IP数据报路由器转发IP数据报 直接交付&#xff1a;源主机与目的主机在同一网络中间接交付&#xff1a;…...

【算力基础】GPU算力计算和其他相关基础(TFLOPS/TOPS/FP32/INT8...)

文章目录 :one: 算力的常见指标:two: 算力计算:three: 常用链接 &#x1f680; 本文主要是聚焦于深度学习领域的 GPU的算力估计&#xff0c;其他类型的硬件设备如CPU可以类比参考。 1️⃣ 算力的常见指标 算力衡量主要与运算速度和精度这两个指标有关。 &#x1f314;速度指…...

UI自动化测试(app端)4.0

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…...

C#与C++交互开发系列(十):数组传递的几种形式

前言 在C#和C的交互开发中&#xff0c;数组传递是一个非常常见且实用的场景。数组可以作为方法的参数&#xff0c;也可以作为响应结果返回。在本篇博客中&#xff0c;我们将探讨几种常见的数组传递方式&#xff0c;展示如何在C#与C之间进行有效的数据交换。我们将主要介绍以下…...

【C++复习】第一弹-基础性语法

前言 学习了C语法这么久了&#xff0c;我其实觉得&#xff0c;我们学习一门语言应该更加注重使用性&#xff0c;对于语法的细节可以通过具体的项目去重新造轮子的时候再去抠细节&#xff0c;也就是说你得学会先走&#xff0c;在去想我们如何走的&#xff0c;身体的哪些肌肉在发…...

软考高级备考记录

一 报考条件和报名流程 报考条件 该考试具有水平考试性质&#xff0c;报考任何级别不需要学历、资历条件&#xff0c;只要达到相应的专业技术水平就可以报考相应的级别 报名流程 软考报名官网&#xff1a;中国计算机技术职业资格网 官网上有 报名时间&#xff0c;考试…...

图为大模型一体机新探索,赋能智能家居行业

在21世纪的今天&#xff0c;科技的飞速进步正以前所未有的速度重塑着我们的生活方式。从智能手机到物联网&#xff0c;从大数据到人工智能&#xff0c;每一项技术创新都在为人类带来前所未有的便利与效率。其中&#xff0c;图为AI大模型一体机作为人工智能领域的最新成果&#…...

精氨酸/赖氨酸多肽(芋螺肽)

产品简介&#xff1a; 芋螺肽&#xff0c;源自瑞士尖端科技&#xff0c;是一种模拟芋螺毒素的生物活性肽。它以其独特的分子结构和高选择性作用于电压门控钠离子通道&#xff08;特别是Nav1.4&#xff09;&#xff0c;为您提供安全、自然且不僵硬的回春效果。芋螺肽&#xff0…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...