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

目录
相关文章
|
6天前
|
供应链 监控 安全
对话|企业如何构建更完善的容器供应链安全防护体系
随着云计算和DevOps的兴起,容器技术和自动化在软件开发中扮演着愈发重要的角色,但也带来了新的安全挑战。阿里云针对这些挑战,组织了一场关于云上安全的深度访谈,邀请了内部专家穆寰、匡大虎和黄竹刚,深入探讨了容器安全与软件供应链安全的关系,分析了当前的安全隐患及应对策略,并介绍了阿里云提供的安全解决方案,包括容器镜像服务ACR、容器服务ACK、网格服务ASM等,旨在帮助企业构建涵盖整个软件开发生命周期的安全防护体系。通过加强基础设施安全性、技术创新以及倡导协同安全理念,阿里云致力于与客户共同建设更加安全可靠的软件供应链环境。
150227 10
|
4天前
|
供应链 监控 安全
|
14天前
|
弹性计算 人工智能 安全
对话 | ECS如何构筑企业上云的第一道安全防线
随着中小企业加速上云,数据泄露、网络攻击等安全威胁日益严重。阿里云推出深度访谈栏目,汇聚产品技术专家,探讨云上安全问题及应对策略。首期节目聚焦ECS安全性,提出三道防线:数据安全、网络安全和身份认证与权限管理,确保用户在云端的数据主权和业务稳定。此外,阿里云还推出了“ECS 99套餐”,以高性价比提供全面的安全保障,帮助中小企业安全上云。
201927 14
对话 | ECS如何构筑企业上云的第一道安全防线
|
6天前
|
SQL 安全 前端开发
预编译为什么能防止SQL注入?
SQL注入是Web应用中常见的安全威胁,攻击者通过构造恶意输入执行未授权的SQL命令。预编译语句(Prepared Statements)是一种有效防御手段,它将SQL代码与数据分离,确保用户输入不会被解释为SQL代码的一部分。本文详细介绍了SQL注入的危害、预编译语句的工作机制,并结合实际案例和多语言代码示例,展示了如何使用预编译语句防止SQL注入,强调了其在提升安全性和性能方面的重要性。
|
10天前
|
搜索推荐 物联网 PyTorch
Qwen2.5-7B-Instruct Lora 微调
本教程介绍如何基于Transformers和PEFT框架对Qwen2.5-7B-Instruct模型进行LoRA微调。
420 34
Qwen2.5-7B-Instruct Lora 微调
|
1月前
|
人工智能 自然语言处理 前端开发
从0开始打造一款APP:前端+搭建本机服务,定制暖冬卫衣先到先得
通义灵码携手科技博主@玺哥超carry 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。
9952 29
|
3天前
|
人工智能 算法 搜索推荐
阿里云百炼xWaytoAGI共学课开课:手把手学AI,大咖带你从零搭建AI应用
阿里云百炼xWaytoAGI共学课开课啦。大咖带你从零搭建AI应用,玩转阿里云百炼大模型平台。3天课程,涵盖企业级文本知识库案例、多模态交互应用实操等,适合有开发经验的企业或独立开发者。直播时间:2025年1月7日-9日 20:00,地点:阿里云/WaytoAGI微信视频号。参与课程可赢取定制保温杯、雨伞及磁吸充电宝等奖品。欢迎加入钉钉共学群(群号:101765012406),与百万开发者共学、共享、共实践!
|
3天前
|
SQL 存储 Apache
基于 Flink 进行增量批计算的探索与实践
本文整理自阿里云高级技术专家、Apache Flink PMC朱翥老师在Flink Forward Asia 2024的分享,内容分为三部分:背景介绍、工作介绍和总结展望。首先介绍了增量计算的定义及其与批计算、流计算的区别,阐述了增量计算的优势及典型需求场景,并解释了为何选择Flink进行增量计算。其次,详细描述了当前的工作进展,包括增量计算流程、执行计划生成、控制消费数据量级及执行进度记录恢复等关键技术点。最后,展示了增量计算的简单示例、性能测评结果,并对未来工作进行了规划。
253 5
基于 Flink 进行增量批计算的探索与实践
|
2天前
|
人工智能 自然语言处理 API
阿里云百炼xWaytoAGI共学课DAY1 - 必须了解的企业级AI应用开发知识点
本课程旨在介绍阿里云百炼大模型平台的核心功能和应用场景,帮助开发者和技术小白快速上手,体验AI的强大能力,并探索企业级AI应用开发的可能性。

热门文章

最新文章