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