Browse Source

增加minio相关类

dev
wxz 3 years ago
parent
commit
0bcd4ad9a5
  1. 6
      epmet-module/epmet-oss/epmet-oss-client/src/main/java/com/epmet/enums/OssTypeEnum.java
  2. 6
      epmet-module/epmet-oss/epmet-oss-server/pom.xml
  3. 39
      epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/CloudStorageConfig.java
  4. 106
      epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/MinioStorageService.java
  5. 2
      epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/OssFactory.java

6
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; private int value;

6
epmet-module/epmet-oss/epmet-oss-server/pom.xml

@ -90,6 +90,12 @@
<groupId>org.springframework</groupId> <groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId> <artifactId>spring-test</artifactId>
</dependency> </dependency>
<!--minio-->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.4.2</version>
</dependency>
</dependencies> </dependencies>
<build> <build>

39
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.AliyunGroup;
import com.epmet.commons.tools.validator.group.QcloudGroup; import com.epmet.commons.tools.validator.group.QcloudGroup;
import com.epmet.commons.tools.validator.group.QiniuGroup; import com.epmet.commons.tools.validator.group.QiniuGroup;
import com.epmet.constants.PrivacyType;
import com.epmet.validator.group.FastDFSGroup; import com.epmet.validator.group.FastDFSGroup;
import com.epmet.validator.group.LocalGroup; import com.epmet.validator.group.LocalGroup;
import lombok.Data; import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.validator.constraints.Range; import org.hibernate.validator.constraints.Range;
import org.hibernate.validator.constraints.URL; import org.hibernate.validator.constraints.URL;
@ -101,6 +103,9 @@ public class CloudStorageConfig implements Serializable {
private String localPath; private String localPath;
private AliyunCloudStorageConfig aliyun; private AliyunCloudStorageConfig aliyun;
private MinioStorageConfig minio;
/** /**
* 阿里云存储配置 * 阿里云存储配置
*/ */
@ -110,6 +115,20 @@ public class CloudStorageConfig implements Serializable {
private AliyunCloudStorageConfigProps external; 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; 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;
}
} }

106
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;
}
}

2
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); abstractCloudStorageService = new FastDFSCloudStorageService(config);
}else if(config.getType() == OssTypeEnum.LOCAL.value()){ }else if(config.getType() == OssTypeEnum.LOCAL.value()){
abstractCloudStorageService = new LocalCloudStorageService(config); abstractCloudStorageService = new LocalCloudStorageService(config);
}else if(config.getType() == OssTypeEnum.MINIO.value()){
abstractCloudStorageService = new MinioStorageService(config);
} }
} }
return abstractCloudStorageService; return abstractCloudStorageService;

Loading…
Cancel
Save