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 8cf84ed6da..c919907267 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..65e58c6a50 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,9 @@ public class CloudStorageConfig implements Serializable {
private String localPath;
private AliyunCloudStorageConfig aliyun;
+
+ private MinioStorageConfig minio;
+
/**
* 阿里云存储配置
*/
@@ -110,6 +115,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 +153,24 @@ public class CloudStorageConfig implements Serializable {
private String aliyunBucketName;
}
+ /**
+ * minio存储配置属性
+ */
+ @Data
+ public static class MinioStorageConfigProps {
+ /**
+ * 外部访问域名,用于用户直接访问minio服务
+ */
+ private String minioExternalDomain;
+ /**
+ * 内部访问域名,用于服务集群内部使用
+ */
+ private String minioInternalDomain;
+ 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..e9204c3623
--- /dev/null
+++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/MinioStorageService.java
@@ -0,0 +1,106 @@
+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);
+
+ log.info("Minio客户端连接所用的域名:{}", props.getMinioInternalDomain());
+
+ /**
+ * minio和服务在同一个局域网,则可以使用内网域名上传,速度更快更稳定
+ */
+ minioClient = MinioClient.builder()
+ .endpoint(props.getMinioInternalDomain()) // 保证和nginx的proxy_set_header Host 一致
+ .credentials(props.getMinioAccessKey(), props.getMinioSecretKey())
+ .build();
+ }
+
+ @Override
+ public String getOssDomain(String privacy) {
+ return this.config.getMinio().getConfigByPrivacy(privacy).getMinioExternalDomain();
+ }
+
+ @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.getMinioExternalDomain() + "/" + 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;