1. 导入依赖
org.springframework.boot spring-boot-configuration-processororg.springframework.boot spring-boot-starterio.minio minio7.1.4
2. 定义minio属性并赋值默认值
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@ConfigurationProperties(prefix = "spring.minio")
public class MinioProperties {
private int port = 9000;
private String endpoint = "127.0.0.1";
private boolean secure = false;
private String accessKey = "minioadmin";
private String secretKey = "minioadmin";
}
3. 定义MinioTemplate方法,并返回结果
public abstract class MinioTemplate {
public abstract MinioResult set(MinioClient client);
public abstract MinioResult create(String bucketName);
public abstract MinioResult remove(String bucketName);
public abstract MinioResult exist(String bucketName);
public abstract MinioResult put(String bucketName, String filename, InputStream in);
public abstract MinioResult remove(String bucketName, String filename);
public abstract MinioResult url(String bucketName, String filename);
}
MinioResult 定义属性
@Data @NoArgsConstructor @AllArgsConstructor @ToString public class MinioResult{ private MinioStatus status; private T t; }
MinioStatus 定义操作是否成功
public enum MinioStatus {
ERROR,
SUCCESS;
}
MinioFactory继承抽象类MinioTemplate
public class MinioFactory extends MinioTemplate{
private MinioClient client;
public MinioFactory(MinioClient client) {
this.client = client;
}
@Override
public MinioResult set(MinioClient client) {
if (client != null){
this.client = client;
return doMinioResult(1, MinioStatus.SUCCESS);
}
return doMinioResult(0, MinioStatus.ERROR);
}
@Override
public MinioResult create(String bucketName) {
try {
client.deleteBucketEncryption(DeleteBucketEncryptionArgs.builder().bucket(bucketName).build());
return doMinioResult(1, MinioStatus.SUCCESS);
}catch (Exception e){
return doMinioResult(0, MinioStatus.ERROR);
}
}
@Override
public MinioResult remove(String bucketName) {
try {
client.deleteBucketEncryption(DeleteBucketEncryptionArgs.builder().bucket(bucketName).build());
return doMinioResult(1, MinioStatus.SUCCESS);
}catch (Exception e){
return doMinioResult(0, MinioStatus.ERROR);
}
}
@Override
public MinioResult exist(String bucketName) {
boolean flag = false;
try {
flag = client.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
return doMinioResult(flag, MinioStatus.SUCCESS);
}catch (Exception e){
return doMinioResult(flag, MinioStatus.ERROR);
}
}
@Override
public MinioResult put(String bucketName, String objectName, InputStream in) {
try {
client.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName).stream(in, in.available(), -1).build());
in.close();
return doMinioResult(1, MinioStatus.SUCCESS);
}catch (Exception e){
return doMinioResult(0, MinioStatus.ERROR);
}
}
@Override
public synchronized MinioResult remove(String bucketName, String objectName) {
try {
client.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build());
return doMinioResult(1, MinioStatus.SUCCESS);
}catch (Exception e){
return doMinioResult(0, MinioStatus.ERROR);
}
}
@Override
public synchronized MinioResult url(String bucketName, String filename) {
String url = "";
try {
url = client.getPresignedObjectUrl(
GetPresignedObjectUrlArgs.builder()
.method(Method.GET)
.bucket(bucketName)
.object(filename)
.expiry(60 * 60 * 24 * 7)
.build());
return doMinioResult(url, MinioStatus.SUCCESS);
}catch (Exception e){
return doMinioResult(url, MinioStatus.ERROR);
}
}
private MinioResult doMinioResult(T t, MinioStatus status){
MinioResult dest = new MinioResult(status, t);
return dest;
}
}
4. 编写minio配置类
@Configuration
@EnableConfigurationProperties(MinioProperties.class)
@ConditionalOnMissingBean(type = "*.*.*.MinioTemplate")
public class MinioConfig {
@Bean(name = "MinioTemplate")
public MinioTemplate createMinioTemplate(MinioProperties properties){
MinioClient client = MinioClient.builder()
.endpoint(properties.getEndpoint(), properties.getPort(), properties.isSecure()).credentials(properties.getAccessKey(), properties.getSecretKey()).build();
MinioTemplate minioTemplate = new MinioFactory(client);
return minioTemplate;
}
}
5. 创建一个自定义注解@EnableMinio, 并导入配置类
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@documented
@Inherited
@import({MinioConfig.class})
public @interface EnableMinio {
}
6. 在springboot工程中使用
@EnableMinio
@SpringBootApplication
public class FokanStructruedApplication {
public static void main(String[] args) {
SpringApplication.run(FokanStructruedApplication.class, args);
}
}



