1. 导入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>7.1.4</version> </dependency>
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<T> { 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 <T>MinioResult doMinioResult(T t, MinioStatus status){ MinioResult dest = new MinioResult<T>(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); } }