前言
在上一篇文章中,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-web
和io.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
- 创建一个配置类,在这个类中,使用我们上一步提供的配置信息,注入一个 Bean 实例
MinioClient
,所有文件的相关操作都可以通过这个 Bean 实现。 - 在
spring.factory
文件中需要添加:org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.gitee.quiet.minio.config.QuietMinioConfiguration
该步骤是实现项目嵌入 Minio 服务的关键,具体的原理可以看源码