From 549f761fa9627bdb63b363aea4fbb6aa4f4d99e2 Mon Sep 17 00:00:00 2001 From: none Date: Wed, 31 May 2023 09:37:09 +0800 Subject: [PATCH] =?UTF-8?q?minio=E9=85=8D=E7=BD=AE=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../playedu/api/checks/AppConfigCheck.java | 49 ++++++++++ .../xyz/playedu/api/config/MinioConfig.java | 70 -------------- .../xyz/playedu/api/constant/CConfig.java | 6 ++ .../controller/backend/UploadController.java | 5 - .../playedu/api/service/AppConfigService.java | 8 +- .../service/impl/AppConfigServiceImpl.java | 14 +++ .../api/service/impl/MinioServiceImpl.java | 94 +++++++++++++------ .../playedu/api/types/config/MinioConfig.java | 27 ++++++ src/main/resources/application.yml | 8 -- 9 files changed, 164 insertions(+), 117 deletions(-) delete mode 100644 src/main/java/xyz/playedu/api/config/MinioConfig.java create mode 100644 src/main/java/xyz/playedu/api/types/config/MinioConfig.java diff --git a/src/main/java/xyz/playedu/api/checks/AppConfigCheck.java b/src/main/java/xyz/playedu/api/checks/AppConfigCheck.java index d5986a8..f17b2ae 100644 --- a/src/main/java/xyz/playedu/api/checks/AppConfigCheck.java +++ b/src/main/java/xyz/playedu/api/checks/AppConfigCheck.java @@ -177,6 +177,55 @@ public class AppConfigCheck implements ApplicationRunner { } }, }); + put( + "MinIO", + new AppConfig[] { + new AppConfig() { + { + setName("AccessKey"); + setSort(10); + setFieldType(BackendConstant.APP_CONFIG_FIELD_TYPE_TEXT); + setKeyName(CConfig.MINIO_ACCESS_KEY); + setKeyValue(""); + } + }, + new AppConfig() { + { + setName("SecretKey"); + setSort(20); + setFieldType(BackendConstant.APP_CONFIG_FIELD_TYPE_TEXT); + setKeyName(CConfig.MINIO_SECRET_KEY); + setKeyValue(""); + } + }, + new AppConfig() { + { + setName("Bucket"); + setSort(30); + setFieldType(BackendConstant.APP_CONFIG_FIELD_TYPE_TEXT); + setKeyName(CConfig.MINIO_BUCKET); + setKeyValue(""); + } + }, + new AppConfig() { + { + setName("Endpoint"); + setSort(40); + setFieldType(BackendConstant.APP_CONFIG_FIELD_TYPE_TEXT); + setKeyName(CConfig.MINIO_ENDPOINT); + setKeyValue(""); + } + }, + new AppConfig() { + { + setName("Domain"); + setSort(50); + setFieldType(BackendConstant.APP_CONFIG_FIELD_TYPE_TEXT); + setKeyName(CConfig.MINIO_DOMAIN); + setKeyValue(""); + } + }, + }); } }; diff --git a/src/main/java/xyz/playedu/api/config/MinioConfig.java b/src/main/java/xyz/playedu/api/config/MinioConfig.java deleted file mode 100644 index 7e2b56e..0000000 --- a/src/main/java/xyz/playedu/api/config/MinioConfig.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2023 杭州白书科技有限公司 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package xyz.playedu.api.config; - -import io.minio.MinioAsyncClient; -import io.minio.MinioClient; - -import lombok.Data; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import xyz.playedu.api.vendor.PlayEduMinioClient; - -/** - * @Author 杭州白书科技有限公司 - * - * @create 2023/2/28 16:38 - */ -@Data -@Configuration -public class MinioConfig { - - @Value("${minio.domain}") - private String domain; - - @Value("${minio.bucket}") - private String bucket; - - @Value("${minio.access-key}") - private String accessKey; - - @Value("${minio.secret-key}") - private String secretKey; - - @Value("${minio.end-point}") - private String endPoint; - - @Bean - public MinioClient getMinioClient() { - return MinioClient.builder() - .endpoint(this.endPoint) - .credentials(this.accessKey, this.secretKey) - .build(); - } - - @Bean - public PlayEduMinioClient getPlayEduMinioClient() { - MinioAsyncClient client = - PlayEduMinioClient.builder() - .endpoint(this.endPoint) - .credentials(this.accessKey, this.secretKey) - .build(); - return new PlayEduMinioClient(client); - } -} diff --git a/src/main/java/xyz/playedu/api/constant/CConfig.java b/src/main/java/xyz/playedu/api/constant/CConfig.java index c499d55..95c0498 100644 --- a/src/main/java/xyz/playedu/api/constant/CConfig.java +++ b/src/main/java/xyz/playedu/api/constant/CConfig.java @@ -29,4 +29,10 @@ public class CConfig { public static final String SYSTEM_H5_URL = "system.h5_url"; public static final String MEMBER_DEFAULT_AVATAR = "member.default_avatar"; + + public static final String MINIO_ACCESS_KEY = "minio.access_key"; + public static final String MINIO_SECRET_KEY = "minio.secret_key"; + public static final String MINIO_BUCKET = "minio.bucket"; + public static final String MINIO_ENDPOINT = "minio.endpoint"; + public static final String MINIO_DOMAIN = "minio.domain"; } diff --git a/src/main/java/xyz/playedu/api/controller/backend/UploadController.java b/src/main/java/xyz/playedu/api/controller/backend/UploadController.java index 1422886..3735c28 100644 --- a/src/main/java/xyz/playedu/api/controller/backend/UploadController.java +++ b/src/main/java/xyz/playedu/api/controller/backend/UploadController.java @@ -36,11 +36,6 @@ import xyz.playedu.api.util.HelperUtil; import java.util.HashMap; -/** - * @Author 杭州白书科技有限公司 - * - * @create 2023/2/28 16:26 - */ @RestController @Slf4j @RequestMapping("/backend/v1/upload") diff --git a/src/main/java/xyz/playedu/api/service/AppConfigService.java b/src/main/java/xyz/playedu/api/service/AppConfigService.java index 7916d22..3cb7ce1 100644 --- a/src/main/java/xyz/playedu/api/service/AppConfigService.java +++ b/src/main/java/xyz/playedu/api/service/AppConfigService.java @@ -18,16 +18,12 @@ package xyz.playedu.api.service; import com.baomidou.mybatisplus.extension.service.IService; import xyz.playedu.api.domain.AppConfig; +import xyz.playedu.api.types.config.MinioConfig; import java.util.HashMap; import java.util.List; import java.util.Map; -/** - * @author tengteng - * @description 针对表【app_config】的数据库操作Service - * @createDate 2023-03-09 11:13:33 - */ public interface AppConfigService extends IService { Map allKeys(); @@ -37,4 +33,6 @@ public interface AppConfigService extends IService { void saveFromMap(HashMap data); Map keyValues(); + + MinioConfig getMinioConfig(); } diff --git a/src/main/java/xyz/playedu/api/service/impl/AppConfigServiceImpl.java b/src/main/java/xyz/playedu/api/service/impl/AppConfigServiceImpl.java index ee51a5b..aa0320f 100644 --- a/src/main/java/xyz/playedu/api/service/impl/AppConfigServiceImpl.java +++ b/src/main/java/xyz/playedu/api/service/impl/AppConfigServiceImpl.java @@ -19,9 +19,11 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; +import xyz.playedu.api.constant.CConfig; import xyz.playedu.api.domain.AppConfig; import xyz.playedu.api.mapper.AppConfigMapper; import xyz.playedu.api.service.AppConfigService; +import xyz.playedu.api.types.config.MinioConfig; import java.util.ArrayList; import java.util.HashMap; @@ -89,4 +91,16 @@ public class AppConfigServiceImpl extends ServiceImpl config = keyValues(); + minioConfig.setAccessKey(config.get(CConfig.MINIO_ACCESS_KEY)); + minioConfig.setSecretKey(config.get(CConfig.MINIO_SECRET_KEY)); + minioConfig.setBucket(config.get(CConfig.MINIO_BUCKET)); + minioConfig.setEndpoint(config.get(CConfig.MINIO_ENDPOINT)); + minioConfig.setDomain(config.get(CConfig.MINIO_DOMAIN)); + return minioConfig; + } } diff --git a/src/main/java/xyz/playedu/api/service/impl/MinioServiceImpl.java b/src/main/java/xyz/playedu/api/service/impl/MinioServiceImpl.java index bfa5619..c42b9a0 100644 --- a/src/main/java/xyz/playedu/api/service/impl/MinioServiceImpl.java +++ b/src/main/java/xyz/playedu/api/service/impl/MinioServiceImpl.java @@ -15,10 +15,7 @@ */ package xyz.playedu.api.service.impl; -import io.minio.GetPresignedObjectUrlArgs; -import io.minio.MinioClient; -import io.minio.PutObjectArgs; -import io.minio.RemoveObjectArgs; +import io.minio.*; import io.minio.http.Method; import lombok.SneakyThrows; @@ -27,8 +24,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; -import xyz.playedu.api.config.MinioConfig; +import xyz.playedu.api.exception.ServiceException; +import xyz.playedu.api.service.AppConfigService; import xyz.playedu.api.service.MinioService; +import xyz.playedu.api.types.config.MinioConfig; import xyz.playedu.api.vendor.PlayEduMinioClient; import java.io.ByteArrayInputStream; @@ -36,22 +35,57 @@ import java.io.InputStream; import java.util.HashMap; import java.util.Map; -/** - * @Author 杭州白书科技有限公司 - * - * @create 2023/3/7 13:29 - */ @Service public class MinioServiceImpl implements MinioService { - @Autowired private MinioConfig c; + private MinioConfig minioConfig = null; - @Autowired private MinioClient client; + @Autowired private AppConfigService appConfigService; - @Autowired private PlayEduMinioClient playEduMinioClient; + @SneakyThrows + private MinioConfig getMinioConfig() { + if (minioConfig == null) { + minioConfig = appConfigService.getMinioConfig(); + if (minioConfig.getAccessKey().isBlank() + || minioConfig.getSecretKey().isBlank() + || minioConfig.getBucket().isBlank() + || minioConfig.getDomain().isBlank() + || minioConfig.getEndpoint().isBlank()) { + throw new ServiceException("MinIO服务未配置"); + } + } + return minioConfig; + } + + private String bucket() { + return getMinioConfig().getBucket(); + } + + public MinioClient getMinioClient() { + MinioConfig c = getMinioConfig(); + + return MinioClient.builder() + .endpoint(c.getEndpoint()) + .credentials(c.getAccessKey(), c.getSecretKey()) + .build(); + } + + public PlayEduMinioClient getPlayEduMinioClient() { + MinioConfig c = getMinioConfig(); + + MinioAsyncClient client = + PlayEduMinioClient.builder() + .endpoint(c.getEndpoint()) + .credentials(c.getAccessKey(), c.getSecretKey()) + .build(); + + return new PlayEduMinioClient(client); + } @Override public String url(String path) { + MinioConfig c = getMinioConfig(); + return c.getDomain() + (c.getDomain().endsWith("/") ? "" : "/") + c.getBucket() @@ -63,47 +97,49 @@ public class MinioServiceImpl implements MinioService { @SneakyThrows public String saveFile(MultipartFile file, String savePath, String contentType) { PutObjectArgs objectArgs = - PutObjectArgs.builder().bucket(c.getBucket()).object(savePath).stream( + PutObjectArgs.builder().bucket(bucket()).object(savePath).stream( file.getInputStream(), file.getSize(), -1) .contentType(contentType) .build(); - client.putObject(objectArgs); + getMinioClient().putObject(objectArgs); return url(savePath); } @Override public String uploadId(String path) { - return playEduMinioClient.uploadId(c.getBucket(), path); + return getPlayEduMinioClient().uploadId(bucket(), path); } @Override @SneakyThrows public String chunkPreSignUrl(String filename, String partNumber, String uploadId) { Map extraQueryParams = new HashMap<>(); - extraQueryParams.put("partNumber", partNumber + ""); + extraQueryParams.put("partNumber", partNumber); extraQueryParams.put("uploadId", uploadId); - return client.getPresignedObjectUrl( - GetPresignedObjectUrlArgs.builder() - .bucket(c.getBucket()) - .object(filename) - .method(Method.PUT) - .expiry(60 * 60 * 24) - .extraQueryParams(extraQueryParams) - .build()); + return getMinioClient() + .getPresignedObjectUrl( + GetPresignedObjectUrlArgs.builder() + .bucket(bucket()) + .object(filename) + .method(Method.PUT) + .expiry(60 * 60 * 24) + .extraQueryParams(extraQueryParams) + .build()); } @Override public String merge(String filename, String uploadId) { - playEduMinioClient.merge(c.getBucket(), filename, uploadId); + getPlayEduMinioClient().merge(bucket(), filename, uploadId); return url(filename); } @Override @SneakyThrows public void removeByPath(String path) { - client.removeObject(RemoveObjectArgs.builder().bucket(c.getBucket()).object(path).build()); + getMinioClient() + .removeObject(RemoveObjectArgs.builder().bucket(bucket()).object(path).build()); } @Override @@ -112,12 +148,12 @@ public class MinioServiceImpl implements MinioService { InputStream inputStream = new ByteArrayInputStream(file); PutObjectArgs objectArgs = - PutObjectArgs.builder().bucket(c.getBucket()).object(savePath).stream( + PutObjectArgs.builder().bucket(bucket()).object(savePath).stream( inputStream, file.length, -1) .contentType(contentType) .build(); - client.putObject(objectArgs); + getMinioClient().putObject(objectArgs); return url(savePath); } diff --git a/src/main/java/xyz/playedu/api/types/config/MinioConfig.java b/src/main/java/xyz/playedu/api/types/config/MinioConfig.java new file mode 100644 index 0000000..dcfa4fd --- /dev/null +++ b/src/main/java/xyz/playedu/api/types/config/MinioConfig.java @@ -0,0 +1,27 @@ +/* + * Copyright 2023 杭州白书科技有限公司 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package xyz.playedu.api.types.config; + +import lombok.Data; + +@Data +public class MinioConfig { + private String accessKey; + private String secretKey; + private String bucket; + private String endpoint; + private String domain; +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index af12145..2d059e9 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -47,14 +47,6 @@ spring: await-termination: true thread-name-prefix: "playedu-default-thread" -# Minio -minio: - access-key: "" - secret-key: "" - end-point: "" - bucket: "" - domain: "" - mybatis: mapper-locations: classpath:mapper/*.xml