大文件秒传,分片上传,断点续传
大文件分片上传
一 功能描述
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端分片多线程上传到服务端,然后web端发起分片合并,完成大文件分片上传功能 2.上传过的大文件,实现秒传 3.上传过程中,服务异常退出,实现断点续传 二 流程图 三 代码运行…...
多生境扩增子探秘:深度溯源与多样性解析
分析微生物组数据的组成结构的一个主要挑战是确定其潜在来源。在微生物来源分析中,随机森林、SourceTracker和FEAST都有较广泛应用。今天,小编就带大家看一篇发表在《iMeta》的文章,使用溯源技术追踪微生物的来源与去向,揭示生物在…...
Selenium4自动化测试常用函数总结,各种场景操作实战
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 seleninum作为自动化测试的工具,自然是提供了很多自动化操作的函数,下面列举下比较常用的函数,更多可见官方文档:…...
图像生成新范式:智源推出全能视觉生成模型 OmniGen
大型语言模型(LLM)的出现统一了语言生成任务,并彻底改变了人机交互。然而,在图像生成领域,能够在单一框架内处理各种任务的统一模型在很大程度上仍未得到探索。近日,智源推出了新的扩散模型架构 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 是一门功能强大且易于学习的编程语言,在高校中被广泛用作教学语言。Python 的期末考试通常会包含基础知识和编程实践,以考察学生的理解与应用能力。本文整理了一套 Python 期末练习题,包括选择题、填空题、判断题和代码题。…...
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 首先安装必要的工具: apt update apt install curl下载并执行nvm安装脚本: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash添加环境变量(如果安装脚本没有自动添加)。编辑 ~/.bash…...
Python实现办公自动化的数据可视化与报表生成
在 Python 中,可以利用多个库来实现办公自动化中的数据可视化与报表生成。以下是具体的方法: 一、数据可视化 使用 matplotlib 库 matplotlib 是一个强大的 Python 绘图库,可以创建各种类型的静态、动态和交互式图表。示例代码:i…...
前端知识串联笔记(更新中...)
1.MVVM MVVM 是指 Model - View - ViewModel,Model 是数据与业务逻辑,View 是视图,ViewModel 用于连接 View 和 Model Model ---> View:将数据转化成所看到的页面,实现的方式:Data Bindings -- 数据绑定…...
PostgreSQL根据字符串的长度排序
PostgreSQL根据字符串的长度排序 在 PostgreSQL 中,你可以使用 LENGTH 函数来获取字符串的长度,并根据这个长度进行排序。LENGTH 函数会返回字符串的字符数。 以下是一个基本的 SQL 查询示例,它根据 some_column 字符串列的长度对表中的行进…...
计算机网络:网络层 —— IP数据报的发送和转发过程
文章目录 IP数据报的发送和转发过程主机发送IP数据报路由器转发IP数据报示例 IP数据报的发送和转发过程 IP 数据报的发送和转发过程包含以下两个过程: 主机发送IP数据报路由器转发IP数据报 直接交付:源主机与目的主机在同一网络中间接交付:…...
【算力基础】GPU算力计算和其他相关基础(TFLOPS/TOPS/FP32/INT8...)
文章目录 :one: 算力的常见指标:two: 算力计算:three: 常用链接 🚀 本文主要是聚焦于深度学习领域的 GPU的算力估计,其他类型的硬件设备如CPU可以类比参考。 1️⃣ 算力的常见指标 算力衡量主要与运算速度和精度这两个指标有关。 🌔速度指…...
UI自动化测试(app端)4.0
✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/cat…...
C#与C++交互开发系列(十):数组传递的几种形式
前言 在C#和C的交互开发中,数组传递是一个非常常见且实用的场景。数组可以作为方法的参数,也可以作为响应结果返回。在本篇博客中,我们将探讨几种常见的数组传递方式,展示如何在C#与C之间进行有效的数据交换。我们将主要介绍以下…...
【C++复习】第一弹-基础性语法
前言 学习了C语法这么久了,我其实觉得,我们学习一门语言应该更加注重使用性,对于语法的细节可以通过具体的项目去重新造轮子的时候再去抠细节,也就是说你得学会先走,在去想我们如何走的,身体的哪些肌肉在发…...
软考高级备考记录
一 报考条件和报名流程 报考条件 该考试具有水平考试性质,报考任何级别不需要学历、资历条件,只要达到相应的专业技术水平就可以报考相应的级别 报名流程 软考报名官网:中国计算机技术职业资格网 官网上有 报名时间,考试…...
图为大模型一体机新探索,赋能智能家居行业
在21世纪的今天,科技的飞速进步正以前所未有的速度重塑着我们的生活方式。从智能手机到物联网,从大数据到人工智能,每一项技术创新都在为人类带来前所未有的便利与效率。其中,图为AI大模型一体机作为人工智能领域的最新成果&#…...
精氨酸/赖氨酸多肽(芋螺肽)
产品简介: 芋螺肽,源自瑞士尖端科技,是一种模拟芋螺毒素的生物活性肽。它以其独特的分子结构和高选择性作用于电压门控钠离子通道(特别是Nav1.4),为您提供安全、自然且不僵硬的回春效果。芋螺肽࿰…...
C++音视频04:音视频编码、生成图片
视频编码 #include <libavutil/log.h> #include <libavutil/opt.h> #include <libavcodec/avcodec.h>static int encode(AVCodecContext *ctx, AVFrame *frame, AVPacket *pkt, FILE *out) {int ret -1;ret avcodec_send_frame(ctx, frame);if (ret < …...
ImageSharp报错
错误信息 System.MissingMethodException: Method not found: System.Span1<SixLabors.ImageSharp.PixelFormats.Rgba32> SixLabors.ImageSharp.Memory.Buffer2D1.GetRowSpan(Int32).需要升级项目 原来仅升级了SixLabors.ImageSharp没有升级drawing,都升级到…...
Android中常用adb命令
目录 1.adb连接安卓模拟器 2.adb列出所有已经连接的设备 3.adb显示设备的日志信息 4.adb 电脑文件推送到安卓模拟器中 5.adb 手机传送文件到电脑 6.adb获取安卓应用的包名和Activity名 附录 1--命令 1)adb devices 2)adb install 路径> 3)…...
PostgreSQL的奥秘:全面解读JSONB——非结构化数据支持的深入探索
引言 PostgreSQL的JSONB数据类型非常灵活,提供了一套操作符来操作JSON数据。本指南将引导您创建一个包含JSONB数据的表,演示各种JSONB操作符,并讨论如何使用倒排索引和部分索引来优化性能。 理解PostgreSQL中的JSONB JSONB,即JS…...
tornado,flaskd这两个框架主要是干什么的
Tornado是一个Python的Web框架,主要用于构建高性能的异步Web应用程序。它基于非阻塞的网络I/O模型,可以处理大量并发连接,适用于需要处理实时性要求较高的应用场景,如实时聊天、实时数据推送等。 Flask是另一个Python的Web框架&a…...
Sigrity Power SI Noise coupling analysis模式如何进行压降仿真分析操作指导
Sigrity Power SI Noise coupling analysis模式如何进行压降仿真分析操作指导 Sigrity除了可以进行交流噪声分析,同样也可以进行压降仿真分析,以下图为例. 3D view...
国产游戏技术能否引领全球?
国产游戏技术能否引领全球? 引言 近年来,中国游戏产业如同春天的嫩芽,迅速成长为全球最大的市场之一。或许你会想,国内的游戏开发者到底在技术上取得了多大的成就?这些成就又能否推动中国游戏走向世界,甚…...
【前端】在 Next.js 开发服务器中应该如何配置 HTTPS?
在 Next.js 的开发环境中,默认情况下是使用 HTTP 协议的。但是,您可以通过一些配置来启用 HTTPS。这在开发阶段可能很有用,尤其是在需要测试涉及安全传输的应用场景时。 下面是如何在 Next.js 开发环境中配置 HTTPS 的步骤: 方法…...
基于深度学习算法的动物检测系统(含PyQt+代码+训练数据集)
基于深度学习算法的动物检测系统(含PyQt代码训练数据集) 前言一、数据集1.1 数据集介绍1.2 数据预处理 二、模型搭建三、训练与测试3.1 模型训练3.2 模型测试 四、PyQt界面实现五、讨论5.1 模型优缺点分析5.2 实验意义 参考资料 前言 本项目是基于Mobil…...
微信小程序美团点餐
引言:外卖已经成为了都市人的必备,在无数个来不及(懒得)做饭的时刻拯救孤单寂寞的胃。美团外卖无疑是外卖届的领头羊,它的很多功能与设计都值得我们学习。本文将从五个方面,对美团外卖展开产品分析…...
成都微信网站建设报价单/青岛seo关键词
在对表姓行更新操作时(UPDATE/INSERT INTO/DELETE) ,先用SELECT进行测试,以防过滤错误。 一、插入操作 SELECT * FROM prod_info WHERE cost20.11;--插入完整数据 INSERT INTO prod_info2(prod_id,prod_name,brand,type,class,cost,sale_price,supplier_id) VALU…...
在线观看视频网站怎么做/营销推广运营
【导读】武大的蒲博士提问:有一个柱状图,拟合了一条曲线,怎样延长拟合曲线到某个点?谭老师没细想说利用Draw工具按照拟合曲线的趋势“画数据”补充几个趋势上的点。现在细想起来,这种方法太Low了。今天谭老师分享一个教…...
网站后缀org/百度网页翻译
Oracle基本操作(登陆、用户、表空间、exp/imp、权限)1. 登陆 (在windows上CMD下执行)1.1. 登陆sys帐户SQLPLUS sys AS SYSDBA1.2. 登陆普通用户SQLPLUS 用户名/密码SQLPLUS 用户名/密码111.111.111.111:1521/test2. 创建用户一般分为四步2.1. 创建临时表空间CREATE TEMPORARY T…...
大连建设工程信息网专家库/页面seo是什么意思
中小型软件开发项目一般都具有任务急、工期短的特点,要在确保满足 时间、质量、成本和效益的情况下交付给客户满意软件产品, 必须保证团队与客户、团队成员之间能良好的沟通与协作。沟通与协作是团队开发活动的基础,它贯穿于软件开发的整个生…...
网站后台登录界面下载/网站首页模板
English tutorial has been published.You can see here http://codeforces.com/blog/entry/5160 【A k-String】 http://www.codeforces.com/contest/219/problem/A 题目大意:给你一堆字母,问用这些字母能不能组成一个由某个循环节循环k次得到的字符串。…...
全站加速 wordpress/营销自动化
我们常在 Linux 系统中使用 dd 命令做文件或设备的读取和写入操作,只是 dd 对读写进度和速度显示不是实时的,下面以两个磁盘设备之间的备份为例说明两种如何在 dd 命令运行过程中得到进度和速度的方法。1、通过 dd 的信号得到进度和速度:新的…...