spring boot 实现Minio分片上传

Springboot2.7 + Minio8 实现大文件分片上传 分片上传: 将一个文件按照指定大小分割成多份数据块(Part)分开上传, 上传之后再由服务端整合为原本的文件网络环境差: 当出现上传失败的时候,只需要对失败的Part进行重新上传断点续传: 中途暂停之后,可以从上次上传完成的Part的位置继续上传加速上传: 要上传到OSS的本地文件很大的时候,可以并行上传多个Part以加快上传速度流式上传: 可以在需要上传的文件大小还不确定的情况下开始上传,这种场景在视频监控等行业应用中比较常见文件较大: 一般文件比较大时,默认情况下一般都会采用分片上传。 阅读详情

应用场景

分片上传,就是将所要上传的文件,按照一定的大小,将整个文件分隔成多个数据块(我们称之为Part)来进行分别上传,上传完之后再由服务端对所有上传的文件进行汇总整合成原始的文件。

分片上传的场景

  • 大文件上传

  • 网络环境环境不好,存在需要重传风险的场景

分片上传的步骤

没有
有
是
否
否
是
前端上传文件的MD5值
判断是否上传过文件
创建文件存储用于存储分块
前端上传文件的MD5值和分块文件的序号
通过序号判断是否包含该分块
前端上传分块
存储分块
是否是最后一块
合并分块
返回文件的存储路径

检查文件的代码

在文件第一次上传时,上传文件的md5值,从而判断文件是否存在minio中

public Result<Boolean> checkFile(String fileMd5) {
        //正常做业务时应该先从数据库中查询

            //如果数据库存在再查询 minio
            GetObjectArgs getObjectArgs = GetObjectArgs.builder()
                    .bucket(bucketName)
                    //                    todo 这里固定了文件的后缀,实际情况下应该从数据库开始查询,得到文件的路径
                    .object(getFilePathByMd5(fileMd5,"png"))
                    .build();
            //查询远程服务获取到一个流对象
            try {
                FilterInputStream inputStream = minioClient.getObject(getObjectArgs);
                if(inputStream!=null){
                    //文件已存在
                    return Result.success(true);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        //文件不存在
        return Result.success(false);
        }

检查分块的代码

检查分块是前端把需要上传的文件经过大小计算后,算出分块的数量,然后把循环发送文件的md5值和分块序号,然后在minio中检查对应文件夹下是否有对应的分块,如果检查到某一处没有对应的分块,便知道传输中断的位置。

 public Result<Boolean> checkChunk(String fileMd5, int chunkIndex) {

        //根据md5得到分块文件所在目录的路径
        String chunkFileFolderPath = getChunkFileFolderPath(fileMd5);

        //如果数据库存在再查询 minio
        GetObjectArgs getObjectArgs = GetObjectArgs.builder()
                .bucket(bucketName)
                .object(chunkFileFolderPath+chunkIndex)
                .build();
        //查询远程服务获取到一个流对象
        try {
            FilterInputStream inputStream = minioClient.getObject(getObjectArgs);
            if(inputStream!=null){
                //文件已存在
                return Result.success(true);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        //文件不存在
        return Result.success(false);
    }

上传分块的代码

    public Result uploadChunk(String fileMd5, int chunk, String localChunkFilePath) {
        //分块文件的路径
        String chunkFilePath = getChunkFileFolderPath(fileMd5) + chunk;
        //获取mimeType
        String mimeType = localChunkFilePath.substring(localChunkFilePath.lastIndexOf("."));
        //将分块文件上传到minio
        boolean b = addMediaFilesToMinIO(localChunkFilePath, mimeType, bucketName, chunkFilePath);
        if(!b){
            return Result.error("上传分块文件失败");
        }
        //上传成功
        return Result.success(true);
    }

合并分块的代码

合并分块文件之前,需要检查文件是否和源文件相同,我们通过把分块合并后取文件的md5值和传输过来的MD5值作比较,如果相同则证明传输正确,把合并后的文件存入minio中,并清除分块文件

public Result mergechunks(String fileMd5, int chunkTotal) {
        //分块文件所在目录
        String chunkFileFolderPath = getChunkFileFolderPath(fileMd5);
        //找到所有的分块文件
        List<ComposeSource> sources = Stream.iterate(0, i -> ++i)
                .limit(chunkTotal).map(i -> ComposeSource.builder()
                        .bucket(bucketName)
                        .object(chunkFileFolderPath + i).build()).collect(Collectors.toList());


        //合并后文件的objectname
        String objectName = getFilePathByMd5(fileMd5, "png");
        //指定合并后的objectName等信息
        ComposeObjectArgs composeObjectArgs = ComposeObjectArgs.builder()
                .bucket(bucketName)
                .object(objectName)//合并后的文件的objectname
                .sources(sources)//指定源文件
                .build();
        //===========合并文件============
        //报错size 1048576 must be greater than 5242880,minio默认的分块文件大小为5M
        try {
            minioClient.composeObject(composeObjectArgs);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("合并文件出错,bucket:{},objectName:{},错误信息:{}",bucketName,objectName,e.getMessage());
            return Result.error("合并文件异常");
        }

        //===========校验合并后的和源文件是否一致,视频上传才成功===========
        //先下载合并后的文件
        File file = downloadFileFromMinIO(bucketName, objectName);
        try(FileInputStream fileInputStream = new FileInputStream(file)){
            //计算合并后文件的md5
            String mergeFile_md5 = DigestUtils.md5Hex(fileInputStream);
            //比较原始md5和合并后文件的md5
            if(!fileMd5.equals(mergeFile_md5)){
                log.error("校验合并文件md5值不一致,原始文件:{},合并文件:{}",fileMd5,mergeFile_md5);
                return Result.error("文件校验失败");
            }

        }catch (Exception e) {
            return Result.error("文件校验失败");
        }

        //==============将文件信息入库============
//        在做业务时要将得到的路径存入数据库
        //==========清理分块文件=========
        clearChunkFiles(chunkFileFolderPath,chunkTotal);


        return Result.success(true);
    }

    /**
     * 清除分块文件
     * @param chunkFileFolderPath 分块文件路径
     * @param chunkTotal 分块文件总数
     */
    private void clearChunkFiles(String chunkFileFolderPath,int chunkTotal){
        Iterable<DeleteObject> objects =  Stream.iterate(0, i -> ++i).limit(chunkTotal).map(i -> new DeleteObject(chunkFileFolderPath+ i)).collect(Collectors.toList());;
        RemoveObjectsArgs removeObjectsArgs = RemoveObjectsArgs.builder().bucket(bucketName).objects(objects).build();
        Iterable<io.minio.Result<DeleteError>> results = minioClient.removeObjects(removeObjectsArgs);
        //要想真正删除
        results.forEach(f->{
            try {
                DeleteError deleteError = f.get();
            } catch (Exception e) {
                e.printStackTrace();
            }
        });

    }
记一次Minio ComposeObject无法在ceph上合并文件的异常运维 问题复现 直接使用minio java sdk(8.3.3版本)对ceph集群中的compose桶中的已存在的多个文件(test1,test2)进行合并(test),代码如下 @Test void contextLoads() throws Exception{ MinioClient minioClient = MinioClient.builder() .endpoint("http://172.23.27 阅读详情

相关推荐

Spring Boot 集成 Minio 分片上传:3 种方案对比与 1 个完整后端实现

本文详细探讨了Spring Boot集成Minio实现分片上传的三种方案,包括Minio Java SDK自动分片、AWS S3 SDK手动分片和前端直传预签名方案,并提供了完整的后端实现代码。通过对比分析各方案的性能与适用场景,帮助开发者选择最优解,同时涵盖分片大小优化、断点续传等关键技术细节,提升大文件上传效率与可靠性。

weixin_34221773的博客 607

SpringBoot + minio实现文件切片极速上传技术(api调用和minio部署,不涉及底层逻辑))

有朋友让我放下!我想,拿起来就已经很难,那放下大概也不会容易!!!

IT小辉同学 1万+

Spring Boot与Minio整合:高效实现大文件分片上传与断点续传

本文详细介绍了如何使用Spring Boot整合Minio对象存储,高效实现大文件分片上传与断点续传功能。通过封装Minio SDK、设计RESTful API以及优化前端并发控制,解决了大文件上传中的网络不稳定、服务器限制等痛点,并提供了生产级优化建议,如Redis状态持久化与秒传功能。

sand8的博客 180

SpringBoot整合minio实现断点续传、分片上传(附源码)

项目下载:https://gitee.com/wusupweilgy/springboot-vue.git

无所谓^_^博客 9833

前端Vue/React + 后端Spring Boot:联手实现MinIO分片上传的完整前后端分离方案

本文详细介绍了如何利用Vue/React前端与Spring Boot后端构建MinIO分片上传的完整解决方案,解决大文件传输中的性能与可靠性问题。通过分片上传技术实现断点续传、多线程并发和实时进度反馈,显著提升用户体验。文章涵盖技术选型、架构设计、前后端实现细节及高级优化技巧,为开发者提供工程化实践指南。

weixin_30627341的博客 586

springboot整合minio+vue实现大文件分片上传,断点续传(复制可用,包含minio工具类)

springboot整合minio+vue实现大文件分片上传,断点续传(复制可用,包含minio工具类) 文件上传,

todoitbo的博客 2万+

Spring Boot集成MinIO实现大文件分片上传

Spring Boot 集成 MinIO实现大文件分片上传

qq_41323045的博客 3825

Spring Boot + MinIO 实现文件的分片上传、秒传、续传功能

手把手教你Spring Boot + MinIO 实现文件的分片上传、秒传、续传功能

qq_30895747的博客 936

《Minio 分片上传实现(基于Spring Boot)》

分片上传(Multipart Upload)是大文件上传的常用方案,可以解决大文件上传超时、网络不稳定等问题

weixin_46054799的博客 1020

Spring Boot整合Minio实现分片上传的完整实践指南

简介:Minio是一款开源的高性能对象存储服务,兼容Amazon S3,适用于存储海量非结构化数据。本文详细介绍了如何在Spring Boot项目中集成Minio,并通过Java SDK实现大文件的分片上传功能。内容涵盖环境搭建、依赖引入、配置管理、Minio客户端初始化,以及分片上传的核心逻辑与异常处理机制。经过实际测试,该方案可有效提升大文件上传的稳定性与性能,适用于图片、视频等资源的高效存储场景。

weixin_35370061的博客 797

Spring Boot与MinIO集成实现大文件分片上传功能的源码分析

在云原生时代,对象存储服务MinIO因其开源、高性能及兼容AWS S3协议的特性,在开发者中广泛流行。Spring Boot作为Java开发者最爱的微服务框架之一,它与MinIO的集成可以极大简化云存储服务的开发流程。通过Spring Boot集成MinIO,开发者可以在项目中轻松实现文件的存储与管理,同时利用MinIO的高可用性和安全性,优化应用的存储能力。

weixin_35705784的博客 742

Spring Boot + MinIO 实现分片上传与断点续传的详细实现

在文件上传场景中,尤其是在涉及大文件上传、视频流、图片或音频文件时,传统的上传方法往往效率低下且容易受限于网络状况。分片上传和断点续传成为了必不可少的技术手段,可以有效提高上传效率并保证文件上传的稳定性。本篇文章将详细讲解如何在 Spring Boot 项目中集成 MinIO,利用 MinIO 提供的对象存储能力,实现分片上传和断点续传的功能。我们将以高质量的技术深度和原创的代码示例进行说明,同时通过表格对比的方式,让大家更清晰地理解这些技术的优势和实现细节。分片上传技术是指将大文件拆分为多个较小的部

一碗黄焖鸡三碗米饭的博客 1838

Minio对象存储及Springboot整合Minio分片上传文章-代码

Minio对象存储及Springboot整合Minio分片上传文章----代码

Spring Boot整合Minio实现上传凭证、分片上传、秒传和断点续传

yml复制代码# application.ymlminio:java复制代码@Component/*** 对象存储服务的URL*//*** Access key就像用户ID,可以唯一标识你的账户*//*** Secret key是你账户的密码*//*** 默认文件桶*/...java复制代码@Configuration@Beantry {现在启动服务即可。

m0_71777195的博客 1971

Java开发者必看:5分钟搞定PaddleOCR表格识别,导出Excel和HTML超详细教程

本文为Java开发者提供了集成PaddleOCR实现智能表格识别的详细教程,包括环境配置、核心代码实现、结果导出到Excel和HTML的步骤,以及性能优化技巧。通过PaddleOCR技术,开发者可以快速将图片表格转换为结构化数据,大幅提升工作效率。

weixin_30872499的博客 99

机器人手眼标定快速精度验证方法

机器人手眼标定快速精度验证方法

laoli_的博客 1万+

使用 Spring Boot + MinIO 实现文件的分片上传、秒传、续传功能开发

MinIO传文件

智轩软件的专栏 1298

Windows-Anaconda3+TensorFlow安装教程

测试环境:win10-64位和win7-64位 (系统必须是64位,因为TensorFlow目前只支持64位) 一、安装Anaconda3 1.下载Anaconda3 Anaconda官网链接:link 这里我们选择Windows版本,python3.6-version-64位,如下图所示。 2.下载完成之后,点击安装Anaconda3 注意:安装过程中要选择添加环境变量,如图 待安装完成...

DoctorCuiLab的博客 3086

Spring Boot 整合 MinIO 实现全场景文件管理:从基础操作到分片上传

最近项目中需要处理大量文件存储和管理的需求,对比了 Nginx、FastDFS、阿里云 OSS 等多种方案后,最终选择了 MinIO。今天就来和大家分享一下 SpringBoot 整合 MinIO 的全过程,从为什么选择 MinIO,到各种文件操作的实现,包括简单的文件上传、批量上传、文件下载、文件预览,再到大文件分片上传和秒传功能。

java_beautiful的博客 947

工业视觉光源频闪控制的三种核心模式与选型实战

本文深入解析工业视觉系统中光源频闪控制的三种核心模式:光源主控、相机主控与硬同步。针对高速飞拍、缺陷检测等场景,详细对比了各模式的时序原理、硬件要求与适用场景,并提供了基于产线速度与检测需求的实战选型指南,帮助工程师有效消除运动模糊、提升成像质量与系统稳定性。

weixin_29299807的博客 435

PyTorch实战(26)——PyTorch分布式训练

在本节中,我们将探讨如何通过跨机器和机器内多进程的分布式训练来加速模型训练过程。我们将系统学习 PyTorch 提供的三大分布式训练 API——torch.distributed、torch.multiprocessing 以及 torch.utils.data.distributed.DistributedSampler,使用这些 API 能够极大的简化分布式训练,介绍如何使用 PyTorch 的分布式训练工具,在 CPU 和 GPU 上加速训练。

盼小辉丶的博客 3834

Spring Boot 整合 MinIO 实现全场景文件管理:从基础操作到分片上传的完整方案

最近项目中需要处理大量文件存储和管理的需求,对比了 Nginx、FastDFS、阿里云 OSS 等多种方案后,最终选择了 MinIO。今天就来和大家分享一下 SpringBoot 整合 MinIO 的全过程,从为什么选择 MinIO,到各种文件操作的实现,包括简单的文件上传、批量上传、文件下载、文件预览,再到大文件分片上传和秒传功能。

Minoz_wl的博客 1346

C语言实现惯性导航初始对准全部核心代码

惯性导航初始对准包括间接粗对准和卡尔曼滤波精对准,其中。为基于卡尔曼滤波的精对准,其中。

十八与她的博客 2283
上一篇: spring boot RabbitMq基础教程
下一篇: 字节赫兹 框架教程 一请求上下文之请求
过去日记
过去日记 新星创作者: 后端开发技术领域 新星创作者: 后端开发技术领域
博客等级 码龄3年 5342粉丝 225原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

过去日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值