当前位置: 首页 > java >正文

Spring Boot 3 如何整合 MinIO 实现分布式文件存储?

全文目录:

    • 开篇语
    • 前言
    • 1. MinIO 简介
    • 2. 搭建 MinIO 服务
      • 2.1 使用 Docker 搭建 MinIO
      • 2.2 创建桶(Bucket)
    • 3. Spring Boot 3 集成 MinIO
      • 3.1 引入 MinIO 依赖
        • Maven 配置
        • Gradle 配置
      • 3.2 配置 MinIO 客户端
        • `application.properties`
        • `application.yml`
      • 3.3 配置 MinIO 客户端 Bean
    • 4. 实现文件上传、下载和删除操作
      • 4.1 文件上传
      • 4.2 文件下载
      • 4.3 文件删除
    • 5. 测试文件上传、下载和删除
      • 5.1 测试文件上传
      • 5.2 测试文件下载
      • 5.3 测试文件删除
    • 6. 小结
    • 文末

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

MinIO 是一个高性能的分布式对象存储系统,兼容 Amazon S3 协议,广泛用于存储大量非结构化数据,如图片、视频、日志等。Spring Boot 3 提供了与 MinIO 的良好集成,可以很方便地将 MinIO 用于分布式文件存储。

在这篇文章中,我们将介绍如何在 Spring Boot 3 中集成 MinIO,搭建一个分布式文件存储系统,具体内容包括:

  1. MinIO 的基本配置。
  2. 如何在 Spring Boot 中集成 MinIO。
  3. 实现文件上传、下载、删除等操作。

1. MinIO 简介

MinIO 是一个开源的对象存储服务,专为云原生应用和大数据存储场景设计。它支持 Amazon S3 API,因此可以与 S3 兼容的应用程序一起使用。它非常适合存储大量的对象数据,并提供高可用、高性能、分布式的存储服务。

MinIO 的核心功能包括:

  • 存储对象数据。
  • 支持分布式部署。
  • 支持多种访问权限控制。
  • 支持 S3 协议,兼容现有的 S3 客户端。

2. 搭建 MinIO 服务

首先,您需要在本地或服务器上搭建 MinIO 服务。可以通过 Docker 快速搭建 MinIO。

2.1 使用 Docker 搭建 MinIO

如果您已经安装了 Docker,可以使用以下命令启动 MinIO:

docker run -d -p 9000:9000 \-e "MINIO_ROOT_USER=minioadmin" \-e "MINIO_ROOT_PASSWORD=minioadmin" \--name minio \minio/minio server /data
  • MINIO_ROOT_USERMINIO_ROOT_PASSWORD:设置 MinIO 的管理员账户。
  • minio/minio:MinIO 官方镜像。
  • /data:MinIO 存储数据的目录。

启动后,MinIO 服务会监听在 http://localhost:9000,您可以通过浏览器访问并使用管理员账户进行登录。

2.2 创建桶(Bucket)

使用 MinIO 浏览器,您可以创建一个或多个桶(Bucket),作为文件存储的容器。例如,可以创建一个名为 file-storage 的桶来存储上传的文件。

3. Spring Boot 3 集成 MinIO

3.1 引入 MinIO 依赖

在 Spring Boot 项目中,首先需要引入 MinIO 的依赖。可以通过 Maven 或 Gradle 方式引入 MinIO 客户端。

Maven 配置

pom.xml 文件中添加以下依赖:

<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.3.3</version> <!-- 请根据需要使用最新版本 -->
</dependency>
Gradle 配置

build.gradle 文件中添加以下依赖:

implementation 'io.minio:minio:8.3.3' // 请根据需要使用最新版本

3.2 配置 MinIO 客户端

application.propertiesapplication.yml 中配置 MinIO 连接参数:

application.properties
minio.url=http://localhost:9000
minio.access-key=minioadmin
minio.secret-key=minioadmin
minio.bucket-name=file-storage
application.yml
minio:url: http://localhost:9000access-key: minioadminsecret-key: minioadminbucket-name: file-storage

3.3 配置 MinIO 客户端 Bean

接下来,我们需要配置一个 MinIO 客户端 Bean,使其能够与 Spring Boot 的依赖注入机制配合工作。

import io.minio.MinioClient;
import io.minio.credentials.Provider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MinioConfig {@Beanpublic MinioClient minioClient() {return MinioClient.builder().endpoint("http://localhost:9000").credentials("minioadmin", "minioadmin").build();}
}
  • MinioClient.builder():创建一个 MinIO 客户端。
  • .endpoint():MinIO 服务的访问地址。
  • .credentials():MinIO 的访问密钥和密钥。

4. 实现文件上传、下载和删除操作

4.1 文件上传

我们可以使用 MinIO 客户端的 putObject 方法将文件上传到 MinIO 的桶(Bucket)中。

import io.minio.MinioClient;
import io.minio.errors.MinioException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.io.InputStream;@Service
public class FileService {@Autowiredprivate MinioClient minioClient;private static final String BUCKET_NAME = "file-storage"; // 存储桶名public void uploadFile(String fileName, InputStream fileInputStream, String contentType) throws MinioException {try {// 上传文件minioClient.putObject(BUCKET_NAME,       // 桶名fileName,          // 文件名fileInputStream,   // 文件内容流contentType        // 文件类型);System.out.println("File uploaded successfully.");} catch (Exception e) {throw new MinioException("Error uploading file: " + e.getMessage());}}
}

4.2 文件下载

可以使用 getObject 方法从 MinIO 下载文件:

import io.minio.MinioClient;
import io.minio.errors.MinioException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.io.InputStream;@Service
public class FileService {@Autowiredprivate MinioClient minioClient;private static final String BUCKET_NAME = "file-storage";public InputStream downloadFile(String fileName) throws MinioException {try {// 获取文件输入流return minioClient.getObject(BUCKET_NAME, fileName);} catch (Exception e) {throw new MinioException("Error downloading file: " + e.getMessage());}}
}

4.3 文件删除

删除文件同样可以通过 removeObject 方法来实现:

import io.minio.MinioClient;
import io.minio.errors.MinioException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class FileService {@Autowiredprivate MinioClient minioClient;private static final String BUCKET_NAME = "file-storage";public void deleteFile(String fileName) throws MinioException {try {// 删除文件minioClient.removeObject(BUCKET_NAME, fileName);System.out.println("File deleted successfully.");} catch (Exception e) {throw new MinioException("Error deleting file: " + e.getMessage());}}
}

5. 测试文件上传、下载和删除

可以通过以下代码进行测试:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.io.InputStream;@RestController
@RequestMapping("/files")
public class FileController {@Autowiredprivate FileService fileService;@PostMapping("/upload")public String uploadFile(@RequestParam("file") InputStream fileInputStream,@RequestParam("fileName") String fileName,@RequestParam("contentType") String contentType) {try {fileService.uploadFile(fileName, fileInputStream, contentType);return "File uploaded successfully.";} catch (Exception e) {return "Error: " + e.getMessage();}}@GetMapping("/download/{fileName}")public String downloadFile(@PathVariable("fileName") String fileName) {try {InputStream fileStream = fileService.downloadFile(fileName);return "File downloaded successfully.";} catch (Exception e) {return "Error: " + e.getMessage();}}@DeleteMapping("/delete/{fileName}")public String deleteFile(@PathVariable("fileName") String fileName) {try {fileService.deleteFile(fileName);return "File deleted successfully.";} catch (Exception e) {return "Error: " + e.getMessage();}}
}

5.1 测试文件上传

通过 POST 请求上传文件:

POST /files/upload
Content-Type: multipart/form-data
file: <fileInputStream>
fileName: "example.txt"
contentType: "text/plain"

5.2 测试文件下载

通过 GET 请求下载文件:

GET /files/download/example.txt

5.3 测试文件删除

通过 DELETE 请求删除文件:

DELETE /files/delete/example.txt

6. 小结

通过以上步骤,我们成功地将 MinIO 集成到 Spring Boot 项目中,实现了一个分布式文件存储系统,支持文件上传、下载和删除操作。MinIO 提供了高性能、可靠的对象存储服务,且与 S3 协议兼容,因此非常适合用于构建现代分布式应用的存储系统。

在实际生产环境中,您可以根据需要调整 MinIO 配置,例如配置高可用部署、设置访问控制、使用加密等。此外,还可以扩展文件存储服务,例如添加文件缓存、支持更复杂的存储结构等。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

http://www.xdnf.cn/news/16367.html

相关文章:

  • MyBatis-Plus 通用 Service 详解:IService 与 CRUD 操作全解析
  • PYTHON从入门到实践-15数据可视化
  • 【资讯】2025年软件行业发展趋势:AI驱动变革,云原生与安全成核心
  • PHP框架之Laravel框架教程:1. laravel搭建
  • 亚马逊测评采购:如何打造安全的环境,技术基础关键
  • 2025年渗透测试面试题总结-2025年HW(护网面试) 70(题目+回答)
  • Avantage6.6下载与安装教程
  • 差模干扰 共模干扰
  • 【隧道篇 / IPsec】(7.6) ❀ 01. 利用向导快速建立IPsec安全隧道 (点对点) ❀ FortiGate 防火墙
  • 详解力扣高频SQL50题之550. 游戏玩法分析 IV【中等】
  • ClickHouse高性能实时分析数据库-消费实时数据流(消费kafka)
  • MySQL进阶学习与初阶复习第三天
  • CSS3知识补充
  • 如何高效合并音视频文件(时间短消耗资源少)(二)
  • ICMPv4报文类型详解表
  • 人形机器人指南(八)操作
  • Xinference vs SGLang:详细对比分析
  • MybatisPlus-18.插件功能-分页插件基本用法
  • Jmeter的元件使用介绍:(五)定时器详解
  • 无需云服务器的内网穿透方案 -- cloudflare tunnel
  • 【AI周报】2025年7月26日
  • 什么是ICMP报文?有什么用?
  • Android Data Binding 深度解析与实践指南
  • easy-llm-cli的安装和使用
  • 【web应用】基于Vue3和Spring Boot的课程管理前后端数据交互过程
  • Vue 3 与 Element Plus 中的 /deep/ 选择器问题
  • 论文阅读-RaftStereo
  • haproxy配置详解
  • QT核心————信号槽
  • 外带服务的温度:藏在包装里的“生活共情力”