MinIO

MinIO 属于 对象存储软件 ,它和一类相似的软件/服务一起解决了 海量文件存储与访问 的问题

MinIO 是一个高性能的 对象存储服务 (Object Storage),兼容 Amazon S3 API

可以用来存储 图片、视频、日志、备份、文件 等非结构化数据。

核心特性:

  • 部署简单,支持单机 / 集群

  • 100% 兼容 Amazon S3 SDK

  • 性能强,适合大数据、机器学习场景

  • 免费开源

它有三大基本概念

Bucket(桶):相当于一个文件夹,存放一类对象。

Object(对象):实际存储的文件,比如图片、视频、文档。

Policy(策略):权限控制,支持私有/公有/自定义。

MinIO 需要部署在自己的服务器上,启动后会提供两个接口

API 端口(默认 9000) → 用于客户端/服务端上传下载文件

控制台端口(默认 9001) → Web 界面,方便你管理 Bucket、文件

MinIO 的功能
存储客户端上传的文件

用户上传头像、商品图片、视频、日志等

客户端访问后端 API,调用 MinIO。后端把文件存到 MinIO 的某个 Bucket

供客户端访问文件

可以通过 URL 直链临时签名 URL 提供访问权限

  • 例如:

    • 公共资源 → 直接用公开 URL 访问

    • 私有资源 → 生成带签名的 临时链接,比如 1 小时有效

    这样既能保证安全,又能让客户端方便获取

典型架构

复制代码
[客户端 App] ←→ [你的后端服务] ←→ [MinIO Server]
                           ↑
                           |  API(上传/下载)
                           |
                       [MinIO Console 管理]

Java 集成 MinIO

引入依赖

复制代码
<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.5.2</version>
</dependency>

初始化客户端

复制代码
MinioClient minioClient =
    MinioClient.builder()
        .endpoint("http://127.0.0.1:9000")
        .credentials("minioadmin", "minioadmin")
        .build();

创建桶

复制代码
if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket("mybucket").build())) {
    minioClient.makeBucket(MakeBucketArgs.builder().bucket("mybucket").build());
}

上传文件

复制代码
minioClient.uploadObject(
    UploadObjectArgs.builder()
        .bucket("mybucket")
        .object("hello.jpg")       // 存储对象名
        .filename("D:/hello.jpg")  // 本地路径
        .build());

下载文件

复制代码
minioClient.downloadObject(
    DownloadObjectArgs.builder()
        .bucket("mybucket")
        .object("hello.jpg")
        .filename("D:/downloaded.jpg")
        .build());

获取文件

复制代码
String url = minioClient.getPresignedObjectUrl(
    GetPresignedObjectUrlArgs.builder()
        .method(Method.GET)
        .bucket("mybucket")
        .object("hello.jpg")
        .expiry(60 * 60) // 链接1小时有效
        .build());
System.out.println("文件访问地址: " + url);

在 SpringBoot 项目中集成

引入依赖

复制代码
<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.5.2</version>
</dependency>

配置 apolication.yml

复制代码
minio:
  endpoint: http://127.0.0.1:9000     # MinIO API地址
  accessKey: minioadmin               # 账号
  secretKey: minioadmin               # 密码
  bucketName: mybucket                # 默认桶

配置类 MinioConfig

复制代码
@Configuration
public class MinioConfig {
    @Value("${minio.endpoint}")
    private String endpoint;
​
    @Value("${minio.accessKey}")
    private String accessKey;
​
    @Value("${minio.secretKey}")
    private String secretKey;
​
    @Bean
    public MinioClient minioClient() {
        return MinioClient.builder()
                .endpoint(endpoint)
                .credentials(accessKey, secretKey)
                .build();
    }
}

封装工具类 MinioService

复制代码
@Service
public class MinioService {
    private final MinioClient minioClient;
​
    @Value("${minio.bucketName}")
    private String bucketName;
​
    public MinioService(MinioClient minioClient) {
        this.minioClient = minioClient;
    }
​
    /** 创建桶 */
    public void createBucket(String bucket) throws Exception {
        boolean exists = minioClient.bucketExists(
                BucketExistsArgs.builder().bucket(bucket).build()
        );
        if (!exists) {
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build());
        }
    }
​
    /** 上传文件 */
    public void uploadFile(MultipartFile file, String objectName) throws Exception {
        createBucket(bucketName);
        try (InputStream inputStream = file.getInputStream()) {
            minioClient.putObject(
                    PutObjectArgs.builder()
                            .bucket(bucketName)
                            .object(objectName)
                            .stream(inputStream, file.getSize(), -1)
                            .contentType(file.getContentType())
                            .build()
            );
        }
    }
​
    /** 获取临时访问链接 */
    public String getFileUrl(String objectName) throws Exception {
        return minioClient.getPresignedObjectUrl(
                GetPresignedObjectUrlArgs.builder()
                        .bucket(bucketName)
                        .object(objectName)
                        .method(Method.GET)
                        .expiry(60 * 60)  // 有效期1小时
                        .build()
        );
    }
}
相关推荐
方也_arkling1 小时前
【Java-Day08】static / final / 枚举
java·开发语言
橙淮1 小时前
Spring Bean作用域与生命周期全解析
java·spring
Chengbei112 小时前
一站式源码安全检测工具、云安全 / APP / 小程序源码敏感信息递归多层目录扫描AK、JWT、手机号、身份证等敏感信息
java·开发语言·安全·web安全·网络安全·系统安全·安全架构
llz_1122 小时前
web-第一次课后作业
java·开发语言·idea
秋92 小时前
Java项目运行5天左右自动宕机:系统性定位与解决方案
java·开发语言·python
小江的记录本2 小时前
【JVM虚拟机】垃圾回收GC:垃圾收集器:CMS:核心原理、回收流程、优缺点、废弃原因(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·spring·面试·maven
DIY源码阁2 小时前
JavaSwing学生成绩管理系统 - MySQL版
java·数据库·mysql·eclipse
basketball6163 小时前
C++ NULL 和 nullptr 区别 以及 nullptr 的核心实现
java·开发语言·c++
JAVA面经实录9174 小时前
MyBatis面试题库
java·mybatis
小江的记录本4 小时前
【JVM虚拟机】垃圾回收GC:垃圾回收算法:标记-清除、标记-复制、标记-整理、分代收集(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·算法·安全·面试