diff --git a/epmet-module/epmet-oss/epmet-oss-client/src/main/java/com/epmet/enums/OssTypeEnum.java b/epmet-module/epmet-oss/epmet-oss-client/src/main/java/com/epmet/enums/OssTypeEnum.java index 1c43b7e121..6bb92ad38b 100644 --- a/epmet-module/epmet-oss/epmet-oss-client/src/main/java/com/epmet/enums/OssTypeEnum.java +++ b/epmet-module/epmet-oss/epmet-oss-client/src/main/java/com/epmet/enums/OssTypeEnum.java @@ -34,7 +34,11 @@ public enum OssTypeEnum { /** * 本地 */ - LOCAL(5); + LOCAL(5), + /** + * minio + */ + MINIO(6); private int value; diff --git a/epmet-module/epmet-oss/epmet-oss-server/pom.xml b/epmet-module/epmet-oss/epmet-oss-server/pom.xml index 951ea10bce..70b1540633 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/pom.xml +++ b/epmet-module/epmet-oss/epmet-oss-server/pom.xml @@ -90,6 +90,12 @@ org.springframework spring-test + + + io.minio + minio + 8.4.2 + diff --git a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/CloudStorageConfig.java b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/CloudStorageConfig.java index 9cd575cbcf..384c77fa42 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/CloudStorageConfig.java +++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/CloudStorageConfig.java @@ -11,9 +11,11 @@ package com.epmet.cloud; import com.epmet.commons.tools.validator.group.AliyunGroup; import com.epmet.commons.tools.validator.group.QcloudGroup; import com.epmet.commons.tools.validator.group.QiniuGroup; +import com.epmet.constants.PrivacyType; import com.epmet.validator.group.FastDFSGroup; import com.epmet.validator.group.LocalGroup; import lombok.Data; +import org.apache.commons.lang3.StringUtils; import org.hibernate.validator.constraints.Range; import org.hibernate.validator.constraints.URL; @@ -101,6 +103,7 @@ public class CloudStorageConfig implements Serializable { private String localPath; private AliyunCloudStorageConfig aliyun; + private MinioStorageConfig minio; /** * 阿里云存储配置 */ @@ -110,6 +113,20 @@ public class CloudStorageConfig implements Serializable { private AliyunCloudStorageConfigProps external; } + @Data + public static class MinioStorageConfig { + private MinioStorageConfigProps internal; + private MinioStorageConfigProps external; + + public MinioStorageConfigProps getConfigByPrivacy(String privacy) { + if (StringUtils.isNotBlank(privacy) && PrivacyType.INTERNAL.equals(privacy)) { + return internal; + } else { + return external; + } + } + } + /** * 阿里云存储配置属性 */ @@ -134,4 +151,17 @@ public class CloudStorageConfig implements Serializable { private String aliyunBucketName; } + /** + * minio存储配置属性 + */ + @Data + public static class MinioStorageConfigProps { + private String minioDomain; + private String minioEndPoint; + private String minioAccessKey; + private String minioSecretKey; + private String minioPrefix; + private String minioBucketName; + } + } diff --git a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/MinioStorageService.java b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/MinioStorageService.java new file mode 100644 index 0000000000..5d1cd1fad6 --- /dev/null +++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/MinioStorageService.java @@ -0,0 +1,99 @@ +package com.epmet.cloud; + +import com.epmet.commons.tools.exception.EpmetErrorCode; +import com.epmet.commons.tools.exception.EpmetException; +import com.epmet.commons.tools.exception.ExceptionUtils; +import io.minio.MinioClient; +import io.minio.ObjectWriteResponse; +import io.minio.PutObjectArgs; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.MediaType; +import org.springframework.http.MediaTypeFactory; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Paths; + +/** + * minio 文件服务 + */ +@Slf4j +public class MinioStorageService extends AbstractCloudStorageService { + + private MinioClient minioClient; + + public MinioStorageService(CloudStorageConfig config) { + this.config = config; + + CloudStorageConfig.MinioStorageConfigProps props = config.getMinio().getConfigByPrivacy(null); + + minioClient = MinioClient.builder() + .endpoint(props.getMinioDomain()) // 保证和nginx的proxy_set_header Host 一致 + .credentials(props.getMinioAccessKey(), props.getMinioSecretKey()) + .build(); + } + + @Override + public String getOssDomain(String privacy) { + return this.config.getMinio().getConfigByPrivacy(privacy).getMinioDomain(); + } + + @Override + public String getOssPrefix(String privacy) { + return this.config.getMinio().getConfigByPrivacy(privacy).getMinioPrefix(); + } + + @Override + public String upload(byte[] data, String path, String privacyType) { + return upload(new ByteArrayInputStream(data), path, privacyType); + } + + @Override + public String uploadSuffix(byte[] data, String suffix, String privacyType) { + return uploadSuffix(new ByteArrayInputStream(data), suffix, privacyType); + } + + /** + * 此处bucket已经做为path + * @param inputStream 字节流 + * @param path 文件路径,包含文件名 + * @param privacyType + * @return + */ + @Override + public String upload(InputStream inputStream, String path, String privacyType) { + CloudStorageConfig.MinioStorageConfigProps props = this.config.getMinio().getConfigByPrivacy(privacyType); + String contentType = MediaTypeFactory.getMediaType(path).orElse(MediaType.APPLICATION_OCTET_STREAM).toString(); + try { + ObjectWriteResponse resp = minioClient.putObject(PutObjectArgs.builder() + .bucket(props.getMinioBucketName()) + .object(path) + .stream(inputStream, inputStream.available(), -1) + .contentType(contentType) + .build()); + + log.debug("minio上传文件成功。bucket:{}, object:{}, privacyType:{}", resp.bucket(), resp.object(), privacyType); + return props.getMinioDomain() + "/" + Paths.get(resp.bucket()).resolve(resp.object()).toString(); + } catch (Exception e) { + String errorMsg = ExceptionUtils.getErrorStackTrace(e); + throw new EpmetException(EpmetErrorCode.SERVER_ERROR.getCode(), errorMsg); + } + } + + @Override + public String uploadSuffix(InputStream inputStream, String suffix, String privacyType) { + CloudStorageConfig.MinioStorageConfigProps props = this.config.getMinio().getConfigByPrivacy(privacyType); + return upload(inputStream, getPath(props.getMinioPrefix(), suffix, privacyType), privacyType); + } + + @Override + public void down(String privacyType) throws IOException { + + } + + @Override + public boolean delete(String objectName, String privacyType) { + return false; + } +} diff --git a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/OssFactory.java b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/OssFactory.java index 3d69543784..a9113d5fba 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/OssFactory.java +++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/OssFactory.java @@ -40,6 +40,8 @@ public final class OssFactory { abstractCloudStorageService = new FastDFSCloudStorageService(config); }else if(config.getType() == OssTypeEnum.LOCAL.value()){ abstractCloudStorageService = new LocalCloudStorageService(config); + }else if(config.getType() == OssTypeEnum.MINIO.value()){ + abstractCloudStorageService = new MinioStorageService(config); } } return abstractCloudStorageService;