MinIO对象存储服务快速搭建与应用

MinIO对象存储服务快速搭建与应用

1.环境准备

1.1.Linux版本

cat /etc/centos-release -> CentOS Linux release 7.9.2009 (Core)

uname -r -> 3.10.0-1160.el7.x86_64

1.2.Docker版本

docker -v -> Docker version 25.0.1, build 29cf629

这里下载时未指定Docker版本,则为当时下载为最新版本。

2.Docker拉取镜像创建容器

shell 复制代码
docker run -d \
-p 9000:9000 \
-p 9001:9001 \
--name minio --restart=always --privileged=true \
-v /minio/data:/data \
-e "MINIO_ROOT_USER=用户名" \
-e "MINIO_ROOT_PASSWORD=密码" \
minio/minio server /data --console-address ":9001"
  • 用户名和密码为MinIO浏览器登录的用户名和密码,请自定义配置。

  • /minio/data 目录为Docker所在的宿主机的目录。

运行结果如下

访问MinIO所在的机器IP + 9001 端口号。

进入到MinIO控制台首页,可以关注一下MinIO的版本,以及一会用到的桶和用户。

以上就快速搭建完成了一个单体应用的MinIO应用服务。

3.MinIO应用服务配置

例如:需要上传头像相关的照片到服务中存储。

3.1.创建桶

创建桶,俗话创建某业务的顶级目录。

直接跳到了刚刚创建桶的根目录下

3.2.创建操作桶的用户

记录一下我刚刚设置的:

AK:ContentManager

SK:ContentManagerContentManager

以上操作,对于粗粒度来说,已经准备的差不多了。开始进入代码层。

4.创建SpringBoot项目

4.1.引入MinIO坐标

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

是web项目喔,记得导入web相关坐标

4.2.创建MinIO相关属性配置类和配置文件所对应

java 复制代码
@ConfigurationProperties(prefix = "app.minio")
@Component
@Data
public class MinioPropertiesConfig {

    private String baseUrl;
    private String endpoint;
    private String bucket;
    private String accessKey;
    private String secretKey;
}
yaml 复制代码
app:
  minio:
    # 访问资源的 URL
    base-url: "http://192.168.3.85:9000"
    # API 端点
    endpoint: "http://192.168.3.85:9000"
    # 上传的 Bucket 桶
    bucket: head-portrait
    # Access Key
    access-key: ContentManager
    # Secret Key
    secret-key: ContentManagerContentManager

4.3.创建MinIO配置类

java 复制代码
@SpringBootConfiguration
public class MinioConfig {

    @Autowired
    private MinioPropertiesConfig minioPropertiesConfig;

    @Bean
    public MinioClient minioClient(){
        return MinioClient.builder()
                .endpoint(minioPropertiesConfig.getEndpoint())
                .credentials(minioPropertiesConfig.getAccessKey(), minioPropertiesConfig.getSecretKey())
                .build();
    }

}

4.4.创建文件上传接口

java 复制代码
@RestController
public class UploadController {

    @Autowired
    private MinioClient minioClient;

    @Autowired
    private MinioPropertiesConfig minioPropertiesConfig;

    /**
     * 上传文件 名称必须为 file
     *
     * @return 主要返回上传后可访问的文件路径
     */
    @PostMapping("/upload")
    public Map<String, Object> upload(MultipartFile file) throws Exception {
        Map<String, Object> map = new HashMap<>();

        // 1 判断文件的合法
        if (Objects.isNull(file) || file.getSize() == 0) {
            map.put("msg", "文件不能为空");
            return map;
        }

        // 可以自定义业务 例如:检查文件的大小 文件的类型 文件的md5等

        // 获取文件的基本信息
        String filename = file.getOriginalFilename();
        long fileSize = file.getSize();
        String fileContentType = file.getContentType();

        // 文件名称去重处理(这里简单处理)
        filename = System.currentTimeMillis() + "_" + filename;

        // 生成需要的上传到云服务的目录(根据业务要求来)
        LocalDate now = LocalDate.now();
        int year = now.getYear();
        int month = now.getMonthValue();
        int day = now.getDayOfMonth();
        String filePath = String.format("%d/%d/%d/%s", year, month, day, filename);

        // 2 检查云存储服务的正常
        boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(minioPropertiesConfig.getBucket()).build());
        if (!exists) {
            // 桶不存在 可以创建桶
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(minioPropertiesConfig.getBucket()).build());
        }

        // 3 上传文件
        try (InputStream inputStream = file.getInputStream()) {
            minioClient.putObject(PutObjectArgs.builder()
                    // 指定 Bucket
                    .bucket(minioPropertiesConfig.getBucket())
                    // 指定 ContentType
                    .contentType(fileContentType)
                    // 指定文件的路径
                    .object(filePath)
                    // 文件的 inputStream 流
                    .stream(inputStream, fileSize, -1)
                    .build());
        }

        // 4 返回文件访问路径
        String fileURL = minioPropertiesConfig.getBaseUrl() + "/" + minioPropertiesConfig.getBucket() + "/" + filePath;

        // 封装返回结果
        map.put("fileURL", fileURL);
        return map;
    }


}

4.5.PostMan工具测试接口

访问返回的云服务存储访问文件地址时:权限不足。

此时就需要开启桶的匿名只读功能

然后就可以访问图片资源啦

观察MinIO桶内的数据

5.测试其他资源功能

5.1.上传zip格式文件

也是上传成功,访问返回的地址,浏览器可自动识别进行下载此资源。

5.2.测试上传视频资源

浏览器访问视频资源则直接播放。

关于MinIO服务的其他高级功能,该篇文章就不记录了

  • MinIO集群部署
  • MinIO读写压力测试
  • MinIO文件细粒度权限控制
  • ...高级玩法

备注:该文章用于自我在文件存储功能上的基础实现记录,以及分享给需要搭建基础文件服务的同学们,曾经我也搭建和使用过FastDFS,那时候感觉到安装部署挺麻烦的,也没有继续使用了,直到接触到MinIO应用服务,听到是对标例如AL的OSS服务,再见。

相关推荐
胡萝卜的兔28 分钟前
go 日志的分装和使用 Zap + lumberjack
开发语言·后端·golang
en-route1 小时前
如何在 Spring Boot 中指定不同的配置文件?
java·spring boot·后端
得意霄尽欢1 小时前
Redis之底层数据结构
数据结构·数据库·redis
hsjkdhs1 小时前
MySQL 数据类型与运算符详解
数据库·mysql
栀椩1 小时前
springboot配置请求日志
java·spring boot·后端
Swift社区2 小时前
如何解决 Spring Bean 循环依赖
java·后端·spring
爱吃烤鸡翅的酸菜鱼2 小时前
【Redis】常用数据结构之Hash篇:从常用命令到使用场景详解
数据结构·数据库·redis·后端·缓存·哈希算法
李少兄3 小时前
IntelliJ IDEA 启动项目时配置端口指南
数据库·sql·intellij-idea
bobz9653 小时前
calico vxlan 模式如何实现和公有云一样的 VPC 功能?
后端
NineData3 小时前
NineData云原生智能数据管理平台新功能发布|2025年8月版
数据库·mongodb·云原生·数据库管理工具·ninedata·数据库迁移·数据复制