forked from rongchao/epmet-cloud-rizhao
5 changed files with 158 additions and 1 deletions
@ -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; |
|||
} |
|||
} |
Loading…
Reference in new issue