Minio实现大文件切片上传

 在进行视频、压缩包等大文件上传时,我们有时会遇到上传速度过慢、上传到一半失败等问题。这时我们可以将一个大文件切成若干个小文件依次上传,这样不仅可以看到上传进度,当上传到一半失败时也可以继承上一次的上传进度,而避免了每次都要从头上传。

大体思路就是前端根据文件名生成MD5编码,再将大文件按100M一块切成若干小片(Minio允许最小分片为5M),给每一片赋上序号(currentPiece)后依次调用接口上传。后端拿到数据后在redis里创建一个list存放已上传的片,再全部上传完成后由Minio进行合并并将地址返回给前端。

文件上传接口

    /*** 大文件切片上传*/@PostMapping("/uploadFileChunk")public ResultMoudel uploadFileChunk( @RequestBody MultipartFileWrapper fileChunk ){try{Date date = new Date();String md5=fileChunk.getMd5();BoundListOperations files= redisTemplate.boundListOps(md5);List<Integer> list=files.range(0,-1);//拿出所有值if (CollectionUtils.isEmpty(list)){//如果是新上传的 创建redis对象files.expire(12, TimeUnit.HOURS);files.leftPush(null);}//如果已上传过 跳过if (list.contains(fileChunk.getCurrentPiece())){return new ResultMoudel().success("");}BigFile bigFile= ossTemplate.putBigFile(fileChunk);//将结果存入redisfiles.leftPush(fileChunk.getCurrentPiece());if (!"continue".equals(bigFile.getTransFlag())) {//文件传输完毕, 删除当前keyredisTemplate.delete(md5);return new ResultMoudel<>().success(bigFile.getLink());}Date date1 = new Date();System.out.println(Thread.currentThread()+"文件上传花费了" + (date1.getTime() - date.getTime()));} catch (Exception exception) {//文件exception.printStackTrace();return new ResultMoudel().error(fileChunk.getCurrentPiece());}return new ResultMoudel().success("");}

对接Minio的文件上传实现

public BigFile putBigFile(MultipartFileWrapper bigPartFile) {try {InputStream inputStream = bigPartFile.getCurrentFile().getInputStream();Map headers = new HashMap();PutObjectArgs putObjectArgs = (PutObjectArgs)((Builder)((Builder)((Builder)PutObjectArgs.builder().object(bigPartFile.getMd5().concat("/") + bigPartFile.getCurrentPiece())).headers(headers)).bucket(this.ossProperties.getTempBucketName())).stream(inputStream, (long)inputStream.available(), -1L).contentType("application/octet-stream").build();this.minioClient.putObject(putObjectArgs);if (this.isFinish(bigPartFile.getMd5(), bigPartFile.getTotalPiece())) {BigFile bigFile = this.mergeFile(bigPartFile.getTotalPiece(), bigPartFile.getMd5(), bigPartFile.getFileName());this.deleteTempFile(bigPartFile.getTotalPiece(), bigPartFile.getMd5());return bigFile;} else {return BigFile.builder().transFlag("continue").build();}} catch (Throwable var6) {throw var6;}}private boolean isFinish(String md5, int totalPieces) throws Exception {Iterable<Result<Item>> results = this.minioClient.listObjects((ListObjectsArgs)((io.minio.ListObjectsArgs.Builder)ListObjectsArgs.builder().bucket(this.ossProperties.getTempBucketName())).prefix(md5.concat("/")).build());Set<String> objectNames = Sets.newHashSet();Iterator var5 = results.iterator();while(var5.hasNext()) {Result<Item> item = (Result)var5.next();objectNames.add(((Item)item.get()).objectName());}return objectNames.size() == totalPieces;}private void deleteTempFile(int totalPieces, String md5) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {try {List<DeleteObject> delObjects = (List)Stream.iterate(0, (i) -> {return i + 1;}).limit((long)totalPieces).map((i) -> {return new DeleteObject(md5.concat("/").concat(Integer.toString(i)));}).collect(Collectors.toList());Iterable<Result<DeleteError>> results = this.minioClient.removeObjects((RemoveObjectsArgs)((io.minio.RemoveObjectsArgs.Builder)RemoveObjectsArgs.builder().bucket(this.ossProperties.getTempBucketName())).objects(delObjects).build());Iterator var5 = results.iterator();while(var5.hasNext()) {Result<DeleteError> result = (Result)var5.next();DeleteError error = (DeleteError)result.get();System.out.println("delete files " + error.objectName() + " " + error.message());}} catch (Throwable var8) {throw var8;}}

 查看上传进度条

@PostMapping("selectChunks")public ResultMoudel selectChunks(@RequestParam String md5){BoundListOperations files=redisTemplate.boundListOps(md5);List range = files.range(0, -1);return new ResultMoudel().success(range.stream().filter(Objects::nonNull));}

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

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

相关文章

【Unity】 HTFramework框架(四十九)新建脚本时,自动向脚本添加【引用命名空间】

更新日期&#xff1a;2024年5月28日。 Github源码&#xff1a;[点我获取源码] Gitee源码&#xff1a;[点我获取源码] 索引 自动向脚本添加【引用命名空间】1.新建一个编辑器脚本2.静态构造方法3.标记 InitializeOnLoad4.添加【默认引用命名空间】的规则5.再次新建脚本 自动向脚…

MaxKB,基于 LLM 大语言模型的知识库问答系统,开箱即用,支持快速嵌入到第三方业务系统。

MaxKB 是一款基于 LLM 大语言模型的知识库问答系统。MaxKB Max Knowledge Base&#xff0c;旨在成为企业的最强大脑。开箱即用&#xff0c;支持快速嵌入到第三方业务系统。 项目链接 github.com/1Panel-dev/MaxKB 项目介绍 MaxKB 是一款基于 LLM 大语言模型的知识库问答系统…

opencv学习备份

2019年3月9日 指针地址向后走 int a[5] {1,100,200,300} int *pa –>*p1 –>*p100 指针移动 –> p0x00000000 内存地址 int a1 int *p&a 指针赋值常量&#xff0c;需要加寻址符号 –>*p1 –>*p CV_8UC1&#xff0c;CV_8UC2&#xff0c;CV_8UC3。 (最后的…

Sping源码(九)—— Bean的初始化(非懒加载)— EmbeddedValueResolver

序言 上一篇文章介绍了ConversionService,顺着finishBeanFactoryInitialization主流程继续往下走&#xff0c;这篇文章介绍EmbeddedValueResolver。 源码 源码中关于EmbeddedValueResolver有说到&#xff0c;如果没有BeanPostProcessor则创建一个默认的内嵌的值解析器。那我…

【C++】d1

关键字&#xff1a; 运行、前缀、输入输出、换行 运行f10 前缀必须项&#xff1a; #include <iostream> using namespace std; 输入/输出&#xff1a; cin >> 输入 cout << 输出 语句通过>>或<<分开 换行 endl或者"\n"

了解CSS中的link和@import引入CSS的区别

CSS中的link和import引入CSS的主要区别如下: 1&#xff1a;引入方式: link是HTML标签,用于在HTML文档中引入外部资源,如CSS文件。import是CSS语法,用于在CSS文件中引入其他CSS文件。2&#xff1a;加载顺序: link引入的CSS文件会与HTML文档并行加载,不会阻塞HTML文档的解析。im…

VMware报平台不支持虚拟化Win10家庭版关闭Hyper-V及内核隔离

1.BIOS中开启虚拟化功能 2.启动或关闭程序中找不到Hyper-v 停止 hypervisorlaunchtype&#xff08;Windows Hyper-V 启动加载器&#xff09; 以管理员的身份打开命令行窗口&#xff0c;运行如下命令&#xff0c;关闭停止 Windows Hyper-V 启动加载器 开启 Windows Hyper-V 启…

防火墙基础技术篇:ensp配置防火墙ssh方式登录

防火墙基础技术篇&#xff1a;ensp配置防火墙ssh方式登录 一、SSH 是什么 历史上&#xff0c;网络主机之间的通信是不加密的&#xff0c;属于明文通信。这使得通信很不安全&#xff0c;一个典型的例子就是服务器登录。登录远程服务器的时候&#xff0c;需要将用户输入的密码传…

TECHNIUM INTERNATIONAL: 利用 AI 和 TECHNIUM 矩阵协议引领区块链创新

在充满活力的加密货币和区块链技术领域&#xff0c;Technium International 以领军者的姿态迅速崛起&#xff0c;跻身科技巨头的顶尖行列。Technium International 成立于 2018 年&#xff0c;总部设于塞席尔&#xff0c;透过人工智慧&#xff08;AI&#xff09;和区块链技术的…

智能跳绳的产品体验与思考(一)

我&#xff0c;虽称不上跳绳高手&#xff0c;却对这项运动怀有深厚的热爱&#xff0c;也曾在某电商平台上选购过一款智能跳绳&#xff0c;希望能借此提升我的跳绳技巧。今天&#xff0c;咱们就来聊聊我和这条绳子的发生的一些故事&#xff0c;外加我的一些思考。 此刻&#xf…

揭秘python模块导入的“隐身术”:如何控制模块代码的执行?

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;两个下划线的奥秘 二、案例展示&#xff1a;模块导入与代码执行 1. 导…

win11中文文件名称乱码解决方案

解压后出现以下的乱码 解决方案 步骤1.winR 输入intl.cpl 或 windows 自带的搜索搜“intl.cpl”&#xff0c;打开这个面板控制项 步骤2.在新打开的区域面板中&#xff0c;选择“管理”标签页&#xff0c;点击下方的“更改系统区域设置”按钮 步骤3.取消"Beta版…"选…

4步成功将三方库——speexdsp移植到OpenHarmony

四步实现三方库移植&#xff1a; 1、在Linux下编译要移植的三仓库&#xff0c;分析编译过程&#xff1b; 2、将要移植的三方库加入编译框架中以及产品引用&#xff1b; 3、增量编译出动态链接库和可执行文件推送到开发板上&#xff1b; 4、在开发板上验证移植是否成功、API接口…

greendao实现增删改查

说明&#xff1a;最近碰到一个需求&#xff0c;在安卓上使用greendao框架&#xff0c;实现增删改查数据 效果图&#xff1a; step1: // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript {repositories {go…

Kubernetes——监听机制与调度约束

目录 前言 一、监听机制 1.Pod启动创建过程 2.调度过程 1.指定调度节点 1.1强制匹配 1.2强制约束 二、硬策略和软策略 1.键值运算关系 1.硬策略——requiredDuringSchedulingIgnoredDuringExecution 2.软策略——preferredDuringSchedulingIgnoredDuringExecution …

QTreeWidget 详解

QTreeWidget 详解 QTreeWidget 是 PyQt5 框架中的一个重要部件&#xff0c;它提供了树形结构的视图&#xff0c;可以用于显示层级数据。以下是 QTreeWidget 的详细讲解&#xff0c;包括基本用法、主要方法和属性以及如何与其他组件进行交互。 基本用法 导入模块 要使用 QTree…

UE4编辑器End键Actor贴近地面

void UXXXEditorFunctionLibrary::SnapToFloor(AActor* Actor) { if (Actor) { Actor->Modify(); GEditor->SnapObjectTo(FActorOrComponent(Actor), false, false, false, false); Actor->InvalidateLightingCache(); Actor->UpdateComponentTransforms(); } }

SAP_MM_物料主数据

在SAP的物料管理模块&#xff08;MM&#xff0c;Materials Management&#xff09;中&#xff0c;主数据&#xff08;Master Data&#xff09;是系统中管理物料相关信息的核心。主数据在整个物料管理的生命周期中起到了至关重要的作用&#xff0c;从采购到库存管理&#xff0c;…

基于单片机的自行车里程监测系统的设计

摘 要 &#xff1a;本设计是一种基于单片机的自行车里程监测系统&#xff0c;采用 STC89C52RC 单片机为核心处理芯片&#xff0c;液晶显示器使用 LCD1602 &#xff0c; 速度测量使用霍尔传感器&#xff0c;温度传感器使用 DS18B20 &#xff0c;时间由时钟芯片 DS1302 进行…

增强创作者能力:The Sandbox 首届 “创作者挑战” 回顾

首届 "创作者挑战" 为创作者在平台上赚取收入提供了难得机会。 我们发起 “创作者挑战” 的目的是支持创作者&#xff0c;赋予他们构建元宇宙的能力。我们提出三大行动号召&#xff1a;发布、参与和赚钱。新推出的「参与奖池」&#xff08;Engagement Pool&#xff0…