Spring Boot 3 整合 Minio 实现文件存储

简介: 本文介绍了如何使用 Spring Boot 3 整合 MinIO 实现文件存储服务。MinIO 是一款高性能的对象存储服务器,适合大规模数据存储与分析,支持多种部署环境且文档完备、开源免费。从 MinIO 的快速安装、配置文件公开访问,到 Spring Boot 中集成 MinIO 客户端的步骤,包括创建用户访问密钥、引入依赖包、添加配置信息、编写 MinIO 客户端配置类及上传和预览文件的服务代码。最后通过 Apifox 进行文件上传测试,并验证文件是否成功存储及预览功能是否正常。关注公众号“Harry技术”,回复 minio 获取源码地址。

Spring Boot 3 整合 minio 实现文件存储

01、背景介绍

在软件系统的实际开发进程里,文件存储服务的使用常常是难以避免的。

就拿小型网站系统来说,一般情况下,会把文件存储服务和网站系统部署在同一台服务器上。这种做法在小成本资源投入方面确实具有一定优势。如果网站的访问量处于较低水平,这种方式基本不会引发什么问题。然而,随着网站访问量的逐步攀升,网站文件资源的读取操作变得越来越频繁。此时,单台服务器可能就无法承受如此大量的请求了,进而导致网站打不开或者出现系统异常等情况。

MinIO,作为一款被宣称是世界上速度最快的对象存储服务器,主要为大规模的数据存储和分析而精心打造。它具有很强的适应性,能够在多种环境下进行部署,像物理服务器、虚拟机、容器等都不在话下。更为重要的是,MinIO的技术文档十分完备,这就意味着使用者可以轻松上手。而且,对于个人用户而言,它完全是开源免费的。

今天这篇文章就将带大家一同探索如何运用MinIO搭建一套专属的云存储服务。

2、方案实践

2.1、minio 快速安装

以 windows 操作系统为例,安装请参考《Windows下Minio的安装以及基本使用》。

2.2.3、设置文件公开访问

默认创建的存储桶,都是私有桶,也就是说无法被公开访问。

3、springBoot 集成 minio 实现文件存储

我们一起来看看,如何在 Spring Boot 工程中集成 minio 客户端以便实现文件存储服务。

3.1、创建用户访问密钥

MinIO 支持通过用户、密码来管理存储桶,我们可以利用 minio 客户端来实现文件的上传和下载。点击Access Keys菜单,创建用户名和密码并将其保存,下文会用到。

3.2、引入依赖包

在 Spring Boot 工程,引入  minio 客户端依赖包。我们可以去官网看找到最新的依赖。

<dependency>

   <groupId>io.minio</groupId>

   <artifactId>minio</artifactId>

   <version>8.5.10</version>

</dependency>

3.3、添加相关配置

在application.properties文件中,添加 minio 相关的配置信息.

minio.endpoint=http://127.0.0.1:9090

# 使用账号密码

#minio.access-key=minioadmin

#minio.secret-key=password

# 使用密钥

minio.access-key=eFbF9rSBtgfqiLGDcPDo

minio.secret-key=Sfgc06T1S6zhzVTzCwIFhr6KUs7zqCwOwFkHHez4

minio.bucket-name=harry

API: http://127.0.0.1:9090RootUser: minioadminRootPass: password

注意下这里,因为我们配置的端口是9090,所以这里是9090而不是9000,要不会出现io.minio.errors.InvalidResponseException: Non-XML response from server. Response code: 400, Content-Type: text/xml;...... 异常信息

3.4、编写 Minio 客户端配置类

基于上文的配置信息,编写 Minio 客户端配置类。

@Configuration

public class MinioConfig {

   @Value("${minio.endpoint}")

   private String minioEndpoint;

   @Value("${minio.access-key}")

   private String minioAccessKey;

   @Value("${minio.secret-key}")

   private String minioSecretKey;

   @Bean

   public MinioClient minioClient() {

       return MinioClient.builder()

               .endpoint(minioEndpoint)

               .credentials(minioAccessKey, minioSecretKey)

               .build();

   }

}

3.5、编写上传和文件预览服务

接着利用 minioClient 客户端,编写上传和文件预览服务。

/**

* @author harry

* @公众号 Harry技术

*/

@RestController

public class FileController {

   @Value("${minio.bucket-name}")

   private String bucketName;

   @Autowired

   private MinioClient minioClient;

   /**

    * 文件上传

    */

   @PostMapping("/upload")

   public String upload(@RequestParam("file") MultipartFile file) {

       // 生成文件名(日期文件夹)

       String suffix = FileUtil.getSuffix(file.getOriginalFilename());

       String uuid = IdUtil.simpleUUID();

       String fileName = DateUtil.format(LocalDateTime.now(), "yyyyMMdd") + "/" + uuid + "." + suffix;

       //  try-with-resource 语法糖自动释放流

       try (InputStream inputStream = file.getInputStream()) {

           // 文件上传

           PutObjectArgs putObjectArgs = PutObjectArgs.builder()

                   .bucket(bucketName)

                   .object(fileName)

                   .contentType(file.getContentType())

                   .stream(inputStream, inputStream.available(), -1)

                   .build();

           minioClient.putObject(putObjectArgs);

           // 返回文件路径

           String fileUrl;

           GetPresignedObjectUrlArgs getPresignedObjectUrlArgs = GetPresignedObjectUrlArgs.builder()

                   .bucket(bucketName).object(fileName)

                   .method(Method.GET)

                   .build();

           fileUrl = minioClient.getPresignedObjectUrl(getPresignedObjectUrlArgs);

           fileUrl = fileUrl.substring(0, fileUrl.indexOf("?"));

           return fileUrl;

       } catch (Exception e) {

           e.printStackTrace();

           return e.getMessage();

       }

   }

}

3.6、使用Apifox上传

返回图片地址:http://127.0.0.1:9090/harry/20250109/0fd3f0df56674ede8be935951d3170cf.png

curl --location --request POST 'http://127.0.0.1:8080/upload' \

--header 'User-Agent: Apifox/1.0.0 (https://apifox.com)' \

--header 'Accept: /' \

--header 'Host: 127.0.0.1:8080' \

--header 'Connection: keep-alive' \

--header 'Content-Type: multipart/form-data; boundary=--------------------------602606623533285111744711' \

--form 'file=@"C:\Users\Admin\Downloads\微信截图_20250106132845.png"'

3.7、验证

回到 minio 控制台,可以看到刚刚上传的文件信息。

2)文件预览地址验证

在浏览器端,访问http://127.0.0.1:9090/harry/20250109/0fd3f0df56674ede8be935951d3170cf.png预览地址,可以清晰的看到图片能正常展示。

总结

到这里,我们已经掌握了springBoot 整合 minio 实现文件存储的过程。

示例源码:关注公众号“Harry技术”,回复 minio 获取源码地址。

目录
打赏
0
75
76
0
96
分享
相关文章
🗄️Spring Boot 3 整合 MinIO 实现分布式文件存储
本文介绍了如何基于Spring Boot 3和MinIO实现分布式文件存储。随着应用规模扩大,传统的单机文件存储方案难以应对大规模数据和高并发访问,分布式文件存储系统成为更好的选择。文章详细讲解了MinIO的安装、配置及与Spring Boot的整合步骤,包括Docker部署、MinIO控制台操作、Spring Boot项目中的依赖引入、配置类编写及工具类封装等内容。最后通过一个上传头像的接口示例展示了具体的开发和测试过程,强调了将API操作封装成通用工具类以提高代码复用性和可维护性的重要性。
187 7
🗄️Spring Boot 3 整合 MinIO 实现分布式文件存储
|
4月前
|
Spring Boot集成MinIO
本文介绍了如何在Spring Boot项目中集成MinIO,一个高性能的分布式对象存储服务。主要步骤包括:引入MinIO依赖、配置MinIO属性、创建MinIO配置类和服务类、使用服务类实现文件上传和下载功能,以及运行应用进行测试。通过这些步骤,可以轻松地在项目中使用MinIO的对象存储功能。
263 5
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于 xml 的整合
本教程介绍了基于XML的MyBatis整合方式。首先在`application.yml`中配置XML路径,如`classpath:mapper/*.xml`,然后创建`UserMapper.xml`文件定义SQL映射,包括`resultMap`和查询语句。通过设置`namespace`关联Mapper接口,实现如`getUserByName`的方法。Controller层调用Service完成测试,访问`/getUserByName/{name}`即可返回用户信息。为简化Mapper扫描,推荐在Spring Boot启动类用`@MapperScan`注解指定包路径避免逐个添加`@Mapper`
37 0
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——Thymeleaf 介绍
本课介绍Spring Boot集成Thymeleaf模板引擎。Thymeleaf是一款现代服务器端Java模板引擎,支持Web和独立环境,可实现自然模板开发,便于团队协作。与传统JSP不同,Thymeleaf模板可以直接在浏览器中打开,方便前端人员查看静态原型。通过在HTML标签中添加扩展属性(如`th:text`),Thymeleaf能够在服务运行时动态替换内容,展示数据库中的数据,同时兼容静态页面展示,为开发带来灵活性和便利性。
45 0
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
本课主要讲解Spring Boot项目中的属性配置方法。在实际开发中,测试与生产环境的配置往往不同,因此不应将配置信息硬编码在代码中,而应使用配置文件管理,如`application.yml`。例如,在微服务架构下,可通过配置文件设置调用其他服务的地址(如订单服务端口8002),并利用`@Value`注解在代码中读取这些配置值。这种方式使项目更灵活,便于后续修改和维护。
19 0
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— application.yml 中对日志的配置
在 Spring Boot 项目中,`application.yml` 文件用于配置日志。通过 `logging.config` 指定日志配置文件(如 `logback.xml`),实现日志详细设置。`logging.level` 可定义包的日志输出级别,例如将 `com.itcodai.course03.dao` 包设为 `trace` 级别,便于开发时查看 SQL 操作。日志级别从高到低为 ERROR、WARN、INFO、DEBUG,生产环境建议调整为较高级别以减少日志量。本课程采用 yml 格式,因其层次清晰,但需注意格式要求。
43 0
|
20天前
|
基于SpringBoot的Redis开发实战教程
Redis在Spring Boot中的应用非常广泛,其高性能和灵活性使其成为构建高效分布式系统的理想选择。通过深入理解本文的内容,您可以更好地利用Redis的特性,为应用程序提供高效的缓存和消息处理能力。
129 79
|
5天前
|
SpringBoot自动配置原理
本文深入解析了SpringBoot的核心功能——自动配置,重点探讨了`org.springframework.boot.autoconfigure`及相关注解的工作机制。通过分析`@SpringBootApplication`、`@EnableAutoConfiguration`等注解,揭示了SpringBoot如何基于类路径和条件自动装配Bean
41 7
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——Thymeleaf 的使用
本文介绍了 Thymeleaf 在 Spring Boot 项目中的使用方法,包括访问静态页面、处理对象和 List 数据、常用标签操作等内容。通过示例代码展示了如何配置 404 和 500 错误页面,以及如何在模板中渲染对象属性和列表数据。同时总结了常用的 Thymeleaf 标签,如 `th:value`、`th:if`、`th:each` 等,并提供了官方文档链接以供进一步学习。
64 0
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——Thymeleaf 的使用
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等