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

目录
相关文章
|
4月前
|
存储 Java Linux
SpringBoot × MinIO 极速开发指南:对象存储服务高可用实战
生成临时访问URL接口和文件预览其实是同一个方法,只是文件预览内定了七天访问,而这个方法可以自行制定,单位是秒。方法,所以返回的是地址信息,但是可以通过dubug看到Bucket中的属性,确实是当前所有桶信息。配置类中奖MinIOClient客户端注入到Springboot中。MinIO集群的在Linux上的部署可以参考:​​​​​​​。Nginx代理MinIO集群可以参考:​​​​​​​。从Bucket源码可以看出,并没有实现。
451 0
|
6月前
|
存储 Java 文件存储
🗄️Spring Boot 3 整合 MinIO 实现分布式文件存储
本文介绍了如何基于Spring Boot 3和MinIO实现分布式文件存储。随着应用规模扩大,传统的单机文件存储方案难以应对大规模数据和高并发访问,分布式文件存储系统成为更好的选择。文章详细讲解了MinIO的安装、配置及与Spring Boot的整合步骤,包括Docker部署、MinIO控制台操作、Spring Boot项目中的依赖引入、配置类编写及工具类封装等内容。最后通过一个上传头像的接口示例展示了具体的开发和测试过程,强调了将API操作封装成通用工具类以提高代码复用性和可维护性的重要性。
1283 7
🗄️Spring Boot 3 整合 MinIO 实现分布式文件存储
|
9月前
|
XML Java API
Spring Boot集成MinIO
本文介绍了如何在Spring Boot项目中集成MinIO,一个高性能的分布式对象存储服务。主要步骤包括:引入MinIO依赖、配置MinIO属性、创建MinIO配置类和服务类、使用服务类实现文件上传和下载功能,以及运行应用进行测试。通过这些步骤,可以轻松地在项目中使用MinIO的对象存储功能。
1241 5
|
12天前
|
前端开发 安全 Java
基于springboot+vue开发的会议预约管理系统
一个完整的会议预约管理系统,包含前端用户界面、管理后台和后端API服务。 ### 后端 - **框架**: Spring Boot 2.7.18 - **数据库**: MySQL 5.6+ - **ORM**: MyBatis Plus 3.5.3.1 - **安全**: Spring Security + JWT - **Java版本**: Java 11 ### 前端 - **框架**: Vue 3.3.4 - **UI组件**: Element Plus 2.3.8 - **构建工具**: Vite 4.4.5 - **状态管理**: Pinia 2.1.6 - **HTTP客户端
104 4
基于springboot+vue开发的会议预约管理系统
|
4月前
|
JavaScript 前端开发 Java
制造业ERP源码,工厂ERP管理系统,前端框架:Vue,后端框架:SpringBoot
这是一套基于SpringBoot+Vue技术栈开发的ERP企业管理系统,采用Java语言与vscode工具。系统涵盖采购/销售、出入库、生产、品质管理等功能,整合客户与供应商数据,支持在线协同和业务全流程管控。同时提供主数据管理、权限控制、工作流审批、报表自定义及打印、在线报表开发和自定义表单功能,助力企业实现高效自动化管理,并通过UniAPP实现移动端支持,满足多场景应用需求。
448 1
|
5月前
|
前端开发 Java 关系型数据库
基于Java+Springboot+Vue开发的鲜花商城管理系统源码+运行
基于Java+Springboot+Vue开发的鲜花商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的鲜花商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。技术学习共同进步
421 7
|
1月前
|
前端开发 JavaScript Java
基于springboot+vue开发的校园食堂评价系统【源码+sql+可运行】【50809】
本系统基于SpringBoot与Vue3开发,实现校园食堂评价功能。前台支持用户注册登录、食堂浏览、菜品查看及评价发布;后台提供食堂、菜品与评价管理模块,支持权限控制与数据维护。技术栈涵盖SpringBoot、MyBatisPlus、Vue3、ElementUI等,适配响应式布局,提供完整源码与数据库脚本,可直接运行部署。
85 0
基于springboot+vue开发的校园食堂评价系统【源码+sql+可运行】【50809】
|
4月前
|
供应链 JavaScript BI
ERP系统源码,基于SpringBoot+Vue+ElementUI+UniAPP开发
这是一款专为小微企业打造的 SaaS ERP 管理系统,基于 SpringBoot+Vue+ElementUI+UniAPP 技术栈开发,帮助企业轻松上云。系统覆盖进销存、采购、销售、生产、财务、品质、OA 办公及 CRM 等核心功能,业务流程清晰且操作简便。支持二次开发与商用,提供自定义界面、审批流配置及灵活报表设计,助力企业高效管理与数字化转型。
451 2
ERP系统源码,基于SpringBoot+Vue+ElementUI+UniAPP开发
|
8月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue实现的留守儿童爱心网站设计与实现(计算机毕设项目实战+源码+文档)
博主是一位全网粉丝超过100万的CSDN特邀作者、博客专家,专注于Java、Python、PHP等技术领域。提供SpringBoot、Vue、HTML、Uniapp、PHP、Python、NodeJS、爬虫、数据可视化等技术服务,涵盖免费选题、功能设计、开题报告、论文辅导、答辩PPT等。系统采用SpringBoot后端框架和Vue前端框架,确保高效开发与良好用户体验。所有代码由博主亲自开发,并提供全程录音录屏讲解服务,保障学习效果。欢迎点赞、收藏、关注、评论,获取更多精品案例源码。
|
8月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue实现的家政服务管理平台设计与实现(计算机毕设项目实战+源码+文档)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!