SpringBoot3.X 整合 MinIO 存储原生方案

2025-07-11 18:50

本文主要是介绍SpringBoot3.X 整合 MinIO 存储原生方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《SpringBoot3.X整合MinIO存储原生方案》本文详细介绍了SpringBoot3.X整合MinIO的原生方案,从环境搭建到核心功能实现,涵盖了文件上传、下载、删除等常用操作,并补充了...

SpringBoot3.X整合MinIO存储原生方案:从环境搭建到实战开发

一、前言:为什么选择MinIO?

在分布式存储领域,MinIO作为一款高性能的对象存储服务,凭借兼容S3 API、轻量级部署、支持分布式集群等特性,成为企业级文件存储的热门选择。尤其在SpringBoot生态中,通过原生SDK整合MinIO可以快速实现文件的上传、下载、删除等功能,适用于云存储、大数据场景、内容管理系统等多种业务场景。

本文将基于SpringBoot3.X版本,从零开始构建MinIO文件存储方案,涵盖环境准备、依赖配置、核心功能开发、进阶特性及问题排查,帮助开发者快速掌握原生整合方案。

二、环境准备

1. 基础环境清单

  • JDK 17+(SpringBoot3.X最低要求)
  • Maven 3.6+
  • MinIO服务(本文使用虚拟机部署的MinIO)
  • IDE:IntelliJ IDEA 2024.3

2. MinIO服务部署

如果没有现成的MinIO服务,可通过docker快速部署本地测试环境:

# 拉取镜像
mkdir -p /minio/data
 chmod 777 /minio/data
 docker run \-d --restart=always \--name minio \--hostname minio-server \
 -p 9000:9000 \-p 9001:9001 \-v /minio/data:/bitnami/minio/data \-e MINIO_ROOT_USER="minio_root" \-e MINIO_ROOT_PASSWORD="minio_123456" \-e MINIO_DEFAULT_BUCKETS="bucket" \-e "MINIO_SERVER_URL=http://192.168.229.128:9000" \
 bitnami/minio:2023.12.7

启动后访问http://192.168.229.128:9001,使用账号(minio_root)密码(minio_123456)登录控制台,创建本文所需的ai-pan桶(Bucket)。

注意ip需要改成自己的,访问页面如下,输入账号密码,点击login

SpringBoot3.X 整合 MinIO 存储原生方案

成功进入页面之后,创建我们的Bucket

SpringBoot3.X 整合 MinIO 存储原生方案

SpringBoot3.X 整合 MinIO 存储原生方案

三、项目初始化与依赖配置

1. 创建SpringBoot项目

通过Spring Initializr创建项目,选择以下依赖:

  • Spring Web(用于接口开发)
  • Lombok(简化实体类代码)

2. 核心依赖引入

pom.XML中添加MinIO SDK依赖(注意版本兼容性,8.3.7兼容SpringBoot3):

<dependency>
  <groupId>io.minio</groupId>
  <artifactId>minio</artifactId>
  <version>8.3.7</version>
</dependency>
<!-- 工具类依赖(非必需,用于文件路径处理) -->
<dependency>
  <groupId>cn.hutool</groupId>
  <artifactId>hutool-all</artifactId>
  <version>5.8.20</version>
</dependency>
<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.30</version>
		</dependency>

四、配置详解

1. 核心配置文件(application.yml)

# MinIO核心配置
minio:
  endpoint: http://192.168.229.128:9000 # API访问地址
  Access-key: minio_root # 访问密钥
  access-secret: minio_123456 # 密钥密码
  bucket-name: ai-pan # 创建的桶名称

2. MinIO配置类

import io.minio.MinioClient;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Data
@Component
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {
    @Value("endpoint")
    private String endpoint;
    @Value("access-key")
    private String accessKey;
    @Value("access-secret")
    private String accessSecret;
    @Value("bucket-name")
    private String bucketName;
    // 预签名url过期时间(ms)
    private Long PRE_SIGN_URL_EXPIRE = 60 * 10 * 1000L;
    @Bean
    public MinioClient getMinioClient() {
        return MinioClient.builder()
                .endpoint(endpoint)
                .credentials(accessKey, accessSecret)
                .build();
    }
}

五、核心功能开发

1. 工具类:文件路径生成

public class CommonUtil {
   public static String getFilePath(String fileName) {
        String suffix = getFileSuffix(fileName);
        // ⽣成⽂件在存储桶中的唯⼀键
        return StrUtil.format("{}/{}/{}/{}.{}", DateUtil.thisYear(),
                DateUtil.thisMonth() + 1,DateUtil.thisDayOfMonth(), IdUtil.randomUUID(), suffix);
    }
}

2. 控制器(TestController)

@RestController
@RequestMapping("/api/test/v1")
public class TestController {
    @Autowired
    private MinioConfig minioConfig;
    @Autowired
    private MinioClient minioClient;
    @PostMapping("/upload")
    public jsonData upload(@RequestParam("file") MultipartFile file) {
        String filename = CommonUtil.getFilePath(file.getOriginalFilename());
        try {
            InputStream inputStream = file.getInputStream();
            minioClient.putObject(PutObjectArgs.builder()
                    .bucket(minioConfig.getBucketName())
                    .object(filename)
                    .stream(inChina编程putStream, file.getSize(), -1)
                    .contentType(file.getContentType())
                    .build());
        } catch (Exception e) {
          编程  e.printStackTrace();
        }
      String url =  minioConfig.getEndpoint() + "/" + minioConfig.getBucketName() +
China编程                "/" + filename;
        return JsonData.buildSuccess(url);
    }
}
// 统一响应类
@Data
public class JsonData {
    private int code;
    private String msg;
    private Object data;
    public static JsonData buildSuccess(Object data) {
        JsonData jsonData = new JsonData();
        jsonData.setCode(0);
        jsonData.setData(data);
        return jsonData;
    }
}

六、测试与验证

1. 接口测试(Apifox)

  • 文件上传
    • 请求方式:POST
    • URL:http://localhost:8081/api/test/v1/upload
    • 参数:form-data,key=file,value=选择本地文件
    • 响应:返回文件访问URL

Header需要我们选择如下

SpringBoot3.X 整合 MinIO 存储原生方案

Body需要我们选择如下,并上传本地文件

SpringBoot3.X 整合 MinIO 存储原生方案

结果如下:

SpringBoot3.X 整合 MinIO 存储原生方案

2. 控制台验证

登录MinIO控制台,进入ai-pan桶,查看上传的文件是否存在。

SpringBoot3.X 整合 MinIO 存储原生方案

七、注意事项

桶权限管理

  • 若未设置桶为公开访问,直接访问URL会报403错误,需使用预签名URL(getPresignedDownloadUrl方法)
  • 设置公开访问:在MinIO控制台→桶设置→访问策略→添加规则,允许所有人访问

八、总结

本文详细介绍了SpringBoot3.X整合MinIO的原生方案,从环境搭建到核心功能实现,涵盖了文件上传、下载、删除等常用操作,并补充了异常处理、参数校验、安全实践等内容。通过原生SDK整合,开发者可以灵活定制存储逻辑,满足不同业务场景需求。

MinIO作为轻量级对象存储方案,非常适合中小规模项目使用,结合SpringBoot的自动化配置,能大幅提升开发效率。后续可进一步扩展断点续php传、文件预览、权限控制等功能,丰富存储服务的能力。

到此这篇关于SpringBoot3.X 整合 MinIO 存储原生方案的文章就介绍到这了,更多相关SpringBoot3.X MinIO 存储内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于SpringBoot3.X 整合 MinIO 存储原生方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155364

相关文章

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

C#实现高性能拍照与水印添加功能完整方案

《C#实现高性能拍照与水印添加功能完整方案》在工业检测、质量追溯等应用场景中,经常需要对产品进行拍照并添加相关信息水印,本文将详细介绍如何使用C#实现一个高性能的拍照和水印添加功能,包含完整的代码实现... 目录1. 概述2. 功能架构设计3. 核心代码实现python3.1 主拍照方法3.2 安全HBIT

k8s搭建nfs共享存储实践

《k8s搭建nfs共享存储实践》本文介绍NFS服务端搭建与客户端配置,涵盖安装工具、目录设置及服务启动,随后讲解K8S中NFS动态存储部署,包括创建命名空间、ServiceAccount、RBAC权限... 目录1. NFS搭建1.1 部署NFS服务端1.1.1 下载nfs-utils和rpcbind1.1

Redis高性能Key-Value存储与缓存利器常见解决方案

《Redis高性能Key-Value存储与缓存利器常见解决方案》Redis是高性能内存Key-Value存储系统,支持丰富数据类型与持久化方案(RDB/AOF),本文给大家介绍Redis高性能Key-... 目录Redis:高性能Key-Value存储与缓存利器什么是Redis?为什么选择Redis?Red

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详