目录
一、配置文件
在application.yml中配置信息
minio:
endpoint: http://<hostname>:<port>
access-key: <access-key>
secret-key: <secret-key>
bucket-name: <bucket-name>
二、定义调用信息
1、定义MinioProperties类
@ConfigurationProperties(prefix = "minio")
@Data
public class MinioProperties {
private String endpoint;
private String accessKey;
private String secretKey;
private String bucketName;
}
2、定义MinioConfiguratio类
配置和创建一个Minio客户端的Spring配置类。以下是该代码的用途和使用方法的详细描述:
-
配置类声明:
@Configuration
: 这个注解表示MinioConfiguration
类是一个配置类,Spring容器在启动时会读取这个类中的配置信息。
-
启用配置属性:
@EnableConfigurationProperties(MinioProperties.class)
: 这个注解启用了对MinioProperties
类的支持,这样就可以将配置文件(如application.properties或application.yml)中的属性自动绑定到MinioProperties
对象上。
-
属性注入:
@Autowired
: 通过这个注解,MinioProperties
类的实例被自动注入到MinioConfiguration
类中。MinioProperties
类应该包含与Minio服务相关的配置属性,如端点URL、访问密钥和秘密密钥。
-
创建Minio客户端Bean:
@Bean
: 这个注解定义了一个Bean,minioClient
方法返回一个MinioClient
对象。Spring容器会管理这个Bean的生命周期,并在需要时将其注入到其他Bean中。
// 声明这是一个配置类
@Configuration
// 启用配置属性,这里指的是MinioProperties
@EnableConfigurationProperties(MinioProperties.class)
public class MinioConfiguration {
// 自动注入Minio属性配置
@Autowired
private MinioProperties properties;
// 定义一个Bean,用于创建Minio客户端实例
@Bean
public MinioClient minioClient() {
// 使用MinioClient的构建器模式来创建客户端实例
return MinioClient
.builder()
// 设置Minio服务的端点URL
.endpoint(properties.getEndpoint())
// 设置访问Minio服务的认证信息
.credentials(properties.getAccessKey(), properties.getSecretKey())
// 构建并返回MinioClient实例
.build();
}
}
三、定义接口
返回文件的URL,字符串类型
@Tag(name = "文件管理")
@RequestMapping("/admin/file")
@RestController
public class FileUploadController {
@Autowired
private FileService fileService;
@Operation(summary = "上传文件")
@PostMapping("upload")
public Result<String> upload(@RequestParam MultipartFile file) {
String url = fileService.upload(file);
System.out.println(url);
return Result.ok(url);
}
}
四、上传文件业务逻辑
-
类声明和注解:
@Service
: 这个注解告诉Spring框架,这个类是一个服务组件,它将被注册为一个Spring Bean,可以在Spring容器中被其他组件注入和使用。
-
成员变量:
minioClient
: 注入的MinioClient
对象,用于与Minio对象存储服务进行交互。minioProperties
: 注入的MinioProperties
对象,包含Minio服务的配置信息,如端点、存储桶名称等。
-
upload方法:
- 用途: 实现了
FileService
接口的upload
方法,用于将客户端上传的文件保存到Minio对象存储服务中。 - 逻辑:
- 检查配置中指定的存储桶是否存在,如果不存在,则创建它。
- 如果存储桶不存在,还会设置一个策略,允许任何人读取存储桶中的对象。
- 构建一个唯一的文件名,使用当前日期和UUID,然后上传文件到Minio存储桶。
- 如果上传成功,返回文件的访问路径,否则返回null。
- 用途: 实现了
-
bucketExists方法:
- 用途: 检查Minio中是否存在指定的存储桶。
-
makeBucket方法:
- 用途: 如果存储桶不存在,创建一个新的存储桶。
-
setBucketPolicy方法:
- 用途: 为存储桶设置策略,这里设置为允许任何人读取存储桶中的对象。
-
putObject方法:
- 用途: 将文件上传到Minio存储桶中,需要指定存储桶名称、对象名称(文件名)、文件输入流和文件大小以及文件类型。
-
createBucketPolicyConfig方法:
- 用途: 创建一个JSON格式的字符串,包含存储桶策略的配置信息,允许匿名用户读取存储桶中的对象。
// 表示该类是一个服务组件,用于实现文件上传功能
@Service
public class FileServiceImpl implements FileService {
// 自动注入MinioClient,用于操作Minio对象存储服务
@Autowired
private MinioClient minioClient;
// 自动注入Minio配置属性,用于获取Minio服务的相关配置信息
@Autowired
private MinioProperties minioProperties;
// 实现FileService接口的upload方法,用于上传文件
@Override
public String upload(MultipartFile file) {
try {
// 检查指定的存储桶是否存在
boolean bucketExists = minioClient.
bucketExists(BucketExistsArgs.builder().
bucket(minioProperties.getBucketName()). // 指定存储桶名称
build());
// 如果存储桶不存在,则创建存储桶
if (!bucketExists) {
minioClient
.makeBucket(MakeBucketArgs.builder()
.bucket(minioProperties.getBucketName()) // 指定存储桶名称
.build());
// 设置存储桶策略,允许匿名用户读取对象
minioClient.
setBucketPolicy(SetBucketPolicyArgs.
builder().
bucket(minioProperties.getBucketName()). // 指定存储桶名称
config(createBucketPolicyConfig(minioProperties.getBucketName())). // 指定存储桶策略配置
build());
}
// 构建文件名,包含日期和UUID,确保文件名的唯一性
String filename = new SimpleDateFormat("yyyyMMdd").format(new Date()) + "/" + UUID.randomUUID() + "-" + file.getOriginalFilename();
// 上传文件到Minio存储桶
minioClient.putObject(PutObjectArgs.builder().
bucket(minioProperties.getBucketName()). // 指定存储桶名称
object(filename). // 指定对象名称(文件名)
stream(file.getInputStream(), file.getSize(), -1). // 指定文件输入流和大小
contentType(file.getContentType()). // 指定文件类型
build());
// 返回文件的访问路径
return String.join("/", minioProperties.getEndpoint(), minioProperties.getBucketName(), filename);
} catch (Exception e) {
// 打印异常堆栈信息
e.printStackTrace();
}
// 如果上传失败,返回null
return null;
}
// 创建存储桶策略配置,允许匿名用户读取存储桶中的对象
private String createBucketPolicyConfig(String bucketName) {
// 使用String.format方法格式化存储桶策略配置字符串
return """
{
"Statement" : [ {
"Action" : "s3:GetObject",
"Effect" : "Allow",
"Principal" : "*",
"Resource" : "arn:aws:s3:::%s/*"
} ],
"Version" : "2024-8-12"
}
""".formatted(bucketName);
}
}