如何结合 Minio 实现一个简单的可嵌入的 Spring Boot Starter 文件服务

本文介绍了如何创建一个可嵌入的 Spring Boot Starter,用于实现文件上传、预览、下载和删除等功能,利用 Minio 作为存储服务。详细讲述了配置、依赖、Starter 的实现,包括 Config Properties、Controller、MinioHandler 和健康状态检查,并提供了示例和配置说明。
摘要由CSDN通过智能技术生成

前言

在上一篇文章中,Markdown 编辑器还没有实现图片上传的功能,要实现图片上传,那么后端服务就需要支持文件上传,文件上传是很多后端服务需要的功能,可以实现一个 Spring Boot Starter 来支持文件的相关功能,比如文件上传、预览、下载、删除等。

实现原理:Creating Your Own Auto-configuration

开源组件版本

Spring Boot:2.6.3

Minio:8.2.1

安装 Minio

Minio 简介:min.io/

# 拉取 minio 镜像
docker pull minio/minio
# 运行 minio 服务
docker run -n minio-dev -p 7000:9000 -p 7001:9001 minio/minio server /data --console-address ":9001"
复制代码

启动完成后,本地访问:http://localhost:7001/

项目依赖

因为是嵌入一个文件服务,在平常的 Spring Boot 项目中可以查看项目的健康状况,那么 Minio 服务的状态也添加进项目健康状况中,这样就能监控 Minio 的服务状况了,所以需要添加依赖 org.springframework.boot:spring-boot-starter-actuator,还需要支持文件相关接口,需要添加org.springframework.boot:spring-boot-starter-webio.minio:minio:8.2.1 依赖。

Starter 实现

自定义 Spring Boot Starter 是 Spring Boot 一个比较常用的扩展点,可以利用这个扩展点为应用提供默认配置或者自定义功能等。

准备

新建一个 quiet-minio-spring-boot-starter 项目,同时新建一个 spring.factories 文件。

spring.factories 文件在 Spring Boot 2.7.0 版本已过期,该版本以上的请自行适配。

Config Properties

classifications:图片分类,一个项目中大部分不止一个地方用到文件上传,为了更好管理文件资源,后端可以限制可以上传的文件分类,以 / 分割可以在 Minio 中创建文件夹,实现分文件夹管理文件。

objectPrefix:访问文件时的前缀,不同的服务,它有不同的 URL,不同的端口号,这个不是必须的,但是在后端统一配置更方便统一管理,这个可以根据团队的规范自行决定是否使用。

/**
 * @author <a href="mailto:lin-mt@outlook.com">lin-mt</a>
 */
@Slf4j
@Getter
@Setter
@ConfigurationProperties(prefix = "quiet.minio")
public class MinioConfigurationProperties implements InitializingBean {

  private String url = "http://localhost:7000";

  private String accessKey;

  private String secretKey;

  private String bucketName;

  private Set<String> classifications;

  private String objectPrefix;

  private Duration connectTimeout = Duration.ofSeconds(10);

  private Duration writeTimeout = Duration.ofSeconds(60);

  private Duration readTimeout = Duration.ofSeconds(10);

  private boolean checkBucket = true;

  private boolean createBucketIfNotExist = true;

  @Override
  public void afterPropertiesSet() {
    Assert.hasText(accessKey, "accessKey must not be empty.");
    Assert.hasText(secretKey, "secretKey must not be empty.");
    Assert.hasText(bucketName, "bucketName must not be empty.");
    Assert.hasText(objectPrefix, "objectPrefix must not be empty.");
  }
}
复制代码

Configuration

  1. 创建一个配置类,在这个类中,使用我们上一步提供的配置信息,注入一个 Bean 实例 MinioClient,所有文件的相关操作都可以通过这个 Bean 实现。
  2. spring.factory 文件中需要添加:org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.gitee.quiet.minio.config.QuietMinioConfiguration

该步骤是实现项目嵌入 Minio 服务的关键,具体的原理可以看源码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值