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 获取源码地址。

目录
相关文章
|
3月前
|
XML Java API
SpringBoot 整合 Minio
本文介绍了如何在服务器上安装并配置Minio服务,包括Minio的依赖、配置类以及基本操作。首先,通过Maven添加Minio依赖;接着,在`yml`文件中配置Minio的连接信息;然后,创建`MinIoClientConfig`类将MinioClient注入到Spring容器中;最后,定义`OSSFileService`接口及其实现类`OssFileServiceImpl`,实现文件上传、获取文件URL、临时访问URL和删除文件等操作。
110 2
|
1月前
|
XML Java API
Spring Boot集成MinIO
本文介绍了如何在Spring Boot项目中集成MinIO,一个高性能的分布式对象存储服务。主要步骤包括:引入MinIO依赖、配置MinIO属性、创建MinIO配置类和服务类、使用服务类实现文件上传和下载功能,以及运行应用进行测试。通过这些步骤,可以轻松地在项目中使用MinIO的对象存储功能。
106 5
|
3月前
|
XML Java Kotlin
springboot + minio + kkfile实现文件预览
本文介绍了如何在容器中安装和启动kkfileviewer,并通过Spring Boot集成MinIO实现文件上传与预览功能。首先,通过下载kkfileviewer源码并构建Docker镜像来部署文件预览服务。接着,在Spring Boot项目中添加MinIO依赖,配置MinIO客户端,并实现文件上传与获取预览链接的接口。最后,通过测试验证文件上传和预览功能的正确性。
214 4
springboot + minio + kkfile实现文件预览
|
2月前
|
存储 前端开发 JavaScript
|
2月前
|
存储 Java API
|
3月前
|
存储 前端开发 Java
springboot整合最新版minio和minio的安装(完整教程,新人必看)
本文详细介绍了如何使用Docker安装配置最新版的MinIO,并展示了如何在Spring Boot应用中整合MinIO以及如何通过前端进行文件上传测试。
434 3
springboot整合最新版minio和minio的安装(完整教程,新人必看)
|
存储 Cloud Native Java
SpringBoot集成MinIO实践
SpringBoot集成MinIO实践
1412 0
SpringBoot集成MinIO实践
|
1天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue实现的留守儿童爱心网站设计与实现(计算机毕设项目实战+源码+文档)
博主是一位全网粉丝超过100万的CSDN特邀作者、博客专家,专注于Java、Python、PHP等技术领域。提供SpringBoot、Vue、HTML、Uniapp、PHP、Python、NodeJS、爬虫、数据可视化等技术服务,涵盖免费选题、功能设计、开题报告、论文辅导、答辩PPT等。系统采用SpringBoot后端框架和Vue前端框架,确保高效开发与良好用户体验。所有代码由博主亲自开发,并提供全程录音录屏讲解服务,保障学习效果。欢迎点赞、收藏、关注、评论,获取更多精品案例源码。
27 10
|
1天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue实现的家政服务管理平台设计与实现(计算机毕设项目实战+源码+文档)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
20 8
|
1天前
|
JavaScript 搜索推荐 Java
基于SpringBoot+Vue实现的家乡特色推荐系统设计与实现(源码+文档+部署)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
19 8