From e7e8b6a9fd0f76d57ba70200a0d5e1fa53f9b8e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9C=E8=A2=81=E6=9D=B0=E2=80=9D?= <“yuanjie@zhiyoutec.com”> Date: Tue, 27 Jul 2021 20:23:54 +0800 Subject: [PATCH 01/31] =?UTF-8?q?fix:=E5=A2=9E=E5=8A=A0=E6=89=AB=E6=8F=8Fm?= =?UTF-8?q?apper?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java | 2 ++ .../cn/axzo/oss/client/controller/ServerFileController.java | 3 +++ .../java/cn/axzo/oss/http/api/ServerFileServiceApi.java | 6 ++++-- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java b/oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java index 9942b59..23ebc7e 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java @@ -1,6 +1,7 @@ package cn.axzo.oss.client; import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -13,6 +14,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; */ @Slf4j @SpringBootApplication(scanBasePackages = {"cn.axzo.oss"}) +@MapperScan(basePackages = {"cn.axzo.oss.dal.mapper"}) public class Bootstrap { public static void main(String[] args) { diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java index 75b4309..8606633 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java @@ -5,6 +5,7 @@ import cn.axzo.oss.http.model.ServerFileDeleteRequest; import cn.axzo.oss.http.model.ServerFileUploadRequest; import cn.axzo.oss.http.model.ServerFileUploadResponse; import cn.azxo.framework.common.model.CommonResponse; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @@ -20,6 +21,8 @@ import javax.validation.Valid; @RestController public class ServerFileController implements ServerFileServiceApi { + + @Override public CommonResponse upload(@Valid @RequestBody ServerFileUploadRequest request) { return null; diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/api/ServerFileServiceApi.java b/oss-http-api/src/main/java/cn/axzo/oss/http/api/ServerFileServiceApi.java index 1d6ec5d..b1e6691 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/api/ServerFileServiceApi.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/api/ServerFileServiceApi.java @@ -5,6 +5,8 @@ import cn.axzo.oss.http.model.ServerFileUploadRequest; import cn.axzo.oss.http.model.ServerFileUploadResponse; import cn.azxo.framework.common.model.CommonResponse; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -27,7 +29,7 @@ public interface ServerFileServiceApi { * @param request * @return */ - @RequestMapping(value = "/upload", method = RequestMethod.POST) + @PutMapping(value = "/upload") CommonResponse upload(ServerFileUploadRequest request); /** @@ -35,7 +37,7 @@ public interface ServerFileServiceApi { * @param request * @return */ - @RequestMapping(value = "/upload", method = RequestMethod.POST) + @DeleteMapping(value = "/delete") CommonResponse delete(ServerFileDeleteRequest request); } From 7232cc51203cec5557e4fabe329dfffbade690a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9C=E8=A2=81=E6=9D=B0=E2=80=9D?= <“yuanjie@zhiyoutec.com”> Date: Wed, 28 Jul 2021 20:26:11 +0800 Subject: [PATCH 02/31] =?UTF-8?q?fix:=E6=B7=BB=E5=8A=A0=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oss/client/config/ApiAccessCheck.java | 18 ++++++++++++ .../resolver/ApiAccessCheckResolver.java | 29 +++++++++++++++++++ oss-client/src/main/resources/bootstrap.yml | 4 +-- 3 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/config/ApiAccessCheck.java create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/config/resolver/ApiAccessCheckResolver.java diff --git a/oss-client/src/main/java/cn/axzo/oss/client/config/ApiAccessCheck.java b/oss-client/src/main/java/cn/axzo/oss/client/config/ApiAccessCheck.java new file mode 100644 index 0000000..7f93078 --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/config/ApiAccessCheck.java @@ -0,0 +1,18 @@ +package cn.axzo.oss.client.config; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @program: oss + * @description: 访问校验 + * @author: mr.jie + * @date: 2021-07-28 00:50 + **/ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface ApiAccessCheck { + +} diff --git a/oss-client/src/main/java/cn/axzo/oss/client/config/resolver/ApiAccessCheckResolver.java b/oss-client/src/main/java/cn/axzo/oss/client/config/resolver/ApiAccessCheckResolver.java new file mode 100644 index 0000000..038c747 --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/config/resolver/ApiAccessCheckResolver.java @@ -0,0 +1,29 @@ +package cn.axzo.oss.client.config.resolver; + +import cn.axzo.oss.client.config.ApiAccessCheck; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.stereotype.Component; + +/** + * @program: oss + * @description: 访问校验实现 + * @author: mr.jie + * @date: 2021-07-28 01:23 + **/ +@Aspect +@Component +@Slf4j +public class ApiAccessCheckResolver { + + + @Around("@annotation(apiAccessCheck)") + public Object methodHandler(ProceedingJoinPoint jp, ApiAccessCheck apiAccessCheck) + throws Throwable { + Object result = jp.proceed(); + return result; + } + +} diff --git a/oss-client/src/main/resources/bootstrap.yml b/oss-client/src/main/resources/bootstrap.yml index 5d6f794..64596a6 100644 --- a/oss-client/src/main/resources/bootstrap.yml +++ b/oss-client/src/main/resources/bootstrap.yml @@ -6,10 +6,10 @@ spring: config: server-addr: ${NACOS_HOST:dev-nacos.axzo.cn}:${NACOS_PORT:80} file-extension: yaml - namespace: ${NACOS_NAMESPACE_ID:35eada10-9574-4db8-9fea-bc6a4960b6c7} + namespace: ${NACOS_NAMESPACE_ID:f82179f1-81a9-41a1-a489-4f9ab5660a6e} prefix: ${spring.application.name} profiles: - active: ${NACOS_PROFILES_ACTIVE:dev} + active: ${NACOS_PROFILES_ACTIVE:local} main: allow-bean-definition-overriding: true From b3442455996a21216fa5511ec7f5a00f13da17f9 Mon Sep 17 00:00:00 2001 From: zhaoyong Date: Wed, 28 Jul 2021 10:18:57 +0800 Subject: [PATCH 03/31] Mybatis Mapper --- oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java | 1 + 1 file changed, 1 insertion(+) diff --git a/oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java b/oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java index 23ebc7e..9c62c48 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java @@ -13,6 +13,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; * @since 2021-07-15 11:34 */ @Slf4j +@MapperScan(basePackages = {"cn.axzo.oss.dal.mapper"}) @SpringBootApplication(scanBasePackages = {"cn.axzo.oss"}) @MapperScan(basePackages = {"cn.axzo.oss.dal.mapper"}) public class Bootstrap { From 44cb98c714f7d7ab2ec36a04f249519ead44e8f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9C=E8=A2=81=E6=9D=B0=E2=80=9D?= Date: Wed, 28 Jul 2021 22:38:38 +0800 Subject: [PATCH 04/31] =?UTF-8?q?fix:=E6=B7=BB=E5=8A=A0=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/axzo/oss/client/Bootstrap.java | 1 - .../resolver/ApiAccessCheckResolver.java | 12 +++++++++--- .../oss/client/controller/ServerFileController.java | 1 - .../axzo/oss/common/annotation}/ApiAccessCheck.java | 2 +- .../axzo/oss/http/model/ServerFileDeleteRequest.java | 2 ++ 5 files changed, 12 insertions(+), 6 deletions(-) rename oss-client/src/main/java/cn/axzo/oss/client/{config => annotation}/resolver/ApiAccessCheckResolver.java (54%) rename {oss-client/src/main/java/cn/axzo/oss/client/config => oss-common/src/main/java/cn/axzo/oss/common/annotation}/ApiAccessCheck.java (90%) diff --git a/oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java b/oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java index 9c62c48..23ebc7e 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java @@ -13,7 +13,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; * @since 2021-07-15 11:34 */ @Slf4j -@MapperScan(basePackages = {"cn.axzo.oss.dal.mapper"}) @SpringBootApplication(scanBasePackages = {"cn.axzo.oss"}) @MapperScan(basePackages = {"cn.axzo.oss.dal.mapper"}) public class Bootstrap { diff --git a/oss-client/src/main/java/cn/axzo/oss/client/config/resolver/ApiAccessCheckResolver.java b/oss-client/src/main/java/cn/axzo/oss/client/annotation/resolver/ApiAccessCheckResolver.java similarity index 54% rename from oss-client/src/main/java/cn/axzo/oss/client/config/resolver/ApiAccessCheckResolver.java rename to oss-client/src/main/java/cn/axzo/oss/client/annotation/resolver/ApiAccessCheckResolver.java index 038c747..13dfa08 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/config/resolver/ApiAccessCheckResolver.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/annotation/resolver/ApiAccessCheckResolver.java @@ -1,11 +1,16 @@ -package cn.axzo.oss.client.config.resolver; +package cn.axzo.oss.client.annotation.resolver; -import cn.axzo.oss.client.config.ApiAccessCheck; +import cn.axzo.oss.common.annotation.ApiAccessCheck; +import com.alibaba.fastjson.JSONObject; +import javax.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; /** * @program: oss @@ -18,10 +23,11 @@ import org.springframework.stereotype.Component; @Slf4j public class ApiAccessCheckResolver { - @Around("@annotation(apiAccessCheck)") public Object methodHandler(ProceedingJoinPoint jp, ApiAccessCheck apiAccessCheck) throws Throwable { + Object[] params = jp.getArgs(); + log.info("methodHandler params = {}", JSONObject.toJSON(params)); Object result = jp.proceed(); return result; } diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java index 8606633..4ecb38f 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java @@ -5,7 +5,6 @@ import cn.axzo.oss.http.model.ServerFileDeleteRequest; import cn.axzo.oss.http.model.ServerFileUploadRequest; import cn.axzo.oss.http.model.ServerFileUploadResponse; import cn.azxo.framework.common.model.CommonResponse; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; diff --git a/oss-client/src/main/java/cn/axzo/oss/client/config/ApiAccessCheck.java b/oss-common/src/main/java/cn/axzo/oss/common/annotation/ApiAccessCheck.java similarity index 90% rename from oss-client/src/main/java/cn/axzo/oss/client/config/ApiAccessCheck.java rename to oss-common/src/main/java/cn/axzo/oss/common/annotation/ApiAccessCheck.java index 7f93078..7a72345 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/config/ApiAccessCheck.java +++ b/oss-common/src/main/java/cn/axzo/oss/common/annotation/ApiAccessCheck.java @@ -1,4 +1,4 @@ -package cn.axzo.oss.client.config; +package cn.axzo.oss.common.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileDeleteRequest.java b/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileDeleteRequest.java index 7bc9314..5c7e07c 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileDeleteRequest.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileDeleteRequest.java @@ -17,4 +17,6 @@ public class ServerFileDeleteRequest { @NotBlank(message = "url must not be null") private String url; + private String appCode; + } From a6e849581de89f207cfea0f9aa679559ceae062b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9C=E8=A2=81=E6=9D=B0=E2=80=9D?= Date: Thu, 29 Jul 2021 00:03:33 +0800 Subject: [PATCH 05/31] =?UTF-8?q?fix:=E6=B7=BB=E5=8A=A0=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ServerFileController.java | 11 ++- oss-common/pom.xml | 4 + .../oss/common/constans/CommonConstants.java | 8 ++ .../oss/common/utils/BeanConvertUtil.java | 28 +++++++ .../cn/axzo/oss/common/utils/JsonUtil.java | 21 ++++++ .../cn/axzo/oss/common/utils/Utility.java | 74 +++++++++++++++++++ .../cn/axzo/oss/dal/repository/FileDao.java | 6 ++ .../oss/dal/repository/impl/FileDaoImpl.java | 7 ++ .../http/model/ServerFileDeleteRequest.java | 2 - .../integration/s3/base/BaseS3Service.java | 13 ++++ .../cn/axzo/oss/manager/api/FileManager.java | 14 ++++ .../api/dto/request/ServerFileDeleteDto.java | 15 ++++ .../response/ServerFileDeleteResponse.java | 11 +++ .../oss/manager/impl/FileManagerImpl.java | 24 ++++++ .../cn/axzo/oss/service/api/FileService.java | 18 +++++ .../oss/service/impl/FileServiceImpl.java | 61 +++++++++++++++ pom.xml | 6 ++ 17 files changed, 320 insertions(+), 3 deletions(-) create mode 100644 oss-common/src/main/java/cn/axzo/oss/common/utils/BeanConvertUtil.java create mode 100644 oss-common/src/main/java/cn/axzo/oss/common/utils/JsonUtil.java create mode 100644 oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java create mode 100644 oss-integration/src/main/java/cn/axzo/oss/integration/s3/base/BaseS3Service.java create mode 100644 oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java create mode 100644 oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileDeleteDto.java create mode 100644 oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/response/ServerFileDeleteResponse.java create mode 100644 oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java create mode 100644 oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java create mode 100644 oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java index 4ecb38f..547b533 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java @@ -1,9 +1,12 @@ package cn.axzo.oss.client.controller; +import cn.axzo.oss.common.utils.BeanConvertUtil; import cn.axzo.oss.http.api.ServerFileServiceApi; import cn.axzo.oss.http.model.ServerFileDeleteRequest; import cn.axzo.oss.http.model.ServerFileUploadRequest; import cn.axzo.oss.http.model.ServerFileUploadResponse; +import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; +import cn.axzo.oss.service.api.FileService; import cn.azxo.framework.common.model.CommonResponse; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @@ -20,7 +23,11 @@ import javax.validation.Valid; @RestController public class ServerFileController implements ServerFileServiceApi { + private final FileService fileService; + public ServerFileController(FileService fileService) { + this.fileService = fileService; + } @Override public CommonResponse upload(@Valid @RequestBody ServerFileUploadRequest request) { @@ -29,6 +36,8 @@ public class ServerFileController implements ServerFileServiceApi { @Override public CommonResponse delete(@Valid @RequestBody ServerFileDeleteRequest request) { - return null; + ServerFileDeleteDto dto = BeanConvertUtil.copyBean(request, ServerFileDeleteDto.class); + fileService.delete(dto); + return CommonResponse.success(); } } diff --git a/oss-common/pom.xml b/oss-common/pom.xml index 07e736d..8d70337 100644 --- a/oss-common/pom.xml +++ b/oss-common/pom.xml @@ -70,6 +70,10 @@ org.projectlombok lombok + + commons-codec + commons-codec + diff --git a/oss-common/src/main/java/cn/axzo/oss/common/constans/CommonConstants.java b/oss-common/src/main/java/cn/axzo/oss/common/constans/CommonConstants.java index 5563e0a..7de66a0 100644 --- a/oss-common/src/main/java/cn/axzo/oss/common/constans/CommonConstants.java +++ b/oss-common/src/main/java/cn/axzo/oss/common/constans/CommonConstants.java @@ -8,4 +8,12 @@ package cn.axzo.oss.common.constans; * @since 2021-07-15 11:45 */ public abstract class CommonConstants { + + /** + * 是否删除 + */ + public interface TableDelete { + Integer UN_DELETE = 0; + Integer DELETE = 1; + } } diff --git a/oss-common/src/main/java/cn/axzo/oss/common/utils/BeanConvertUtil.java b/oss-common/src/main/java/cn/axzo/oss/common/utils/BeanConvertUtil.java new file mode 100644 index 0000000..32a54cd --- /dev/null +++ b/oss-common/src/main/java/cn/axzo/oss/common/utils/BeanConvertUtil.java @@ -0,0 +1,28 @@ +package cn.axzo.oss.common.utils; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.BeansException; + +/** + * @Author admin + * @Description + * @Date 2021/7/28 22:53 + * @Version 0.0.1 + **/ +@Slf4j +public class BeanConvertUtil { + + public static T copyBean(Object source, Class targetCls) { + T target = null; + if (Utility.objIsNotNull(source)) { + try { + target = BeanUtils.instantiateClass(targetCls); + BeanUtils.copyProperties(source, target); + } catch (BeansException e) { + log.warn("copyBean error, e = {}", e); + } + } + return target; + } +} diff --git a/oss-common/src/main/java/cn/axzo/oss/common/utils/JsonUtil.java b/oss-common/src/main/java/cn/axzo/oss/common/utils/JsonUtil.java new file mode 100644 index 0000000..f834e39 --- /dev/null +++ b/oss-common/src/main/java/cn/axzo/oss/common/utils/JsonUtil.java @@ -0,0 +1,21 @@ +package cn.axzo.oss.common.utils; + +import com.alibaba.fastjson.JSONObject; + +/** + * @Author admin + * @Description + * @Date 2021/7/28 23:37 + * @Version 0.0.1 + **/ +public class JsonUtil { + + /** + * 对象转json字符串 + * @param obj + * @return + */ + public static String obj2Str(Object obj){ + return JSONObject.toJSONString(obj); + } +} diff --git a/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java b/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java new file mode 100644 index 0000000..3ee13e7 --- /dev/null +++ b/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java @@ -0,0 +1,74 @@ +package cn.axzo.oss.common.utils; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Objects; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.binary.Hex; + +/** + * @Author admin + * @Description + * @Date 2021/7/28 22:54 + * @Version 0.0.1 + **/ + +@Slf4j +public class Utility { + + /** + * 判断对象为null + * @param obj + * @return + */ + public static boolean objIsNull(Object obj){ + return Objects.isNull(obj); + } + + /** + * 判断对象不为null + * @param obj + * @return + */ + public static boolean objIsNotNull(Object obj){ + return !Objects.isNull(obj); + } + + /** + * 字符串为空 + * @return + */ + public static boolean isBlank(String str){ + int strLen; + if (str == null || (strLen = str.length()) == 0){ + return Boolean.TRUE; + } + for (int i = 0; i< strLen; i++){ + if ((Character.isWhitespace(str.charAt(i)) == false)){ + return false; + } + } + return true; + } + + /** + * 获取md5摘要 + * @param content + * @return + */ + public static String getMd5(String content){ + if (isBlank(content)){ + return content; + } + try { + MessageDigest md5 = MessageDigest.getInstance("MD5"); + md5.reset(); + md5.update(content.getBytes(StandardCharsets.UTF_8)); + return Hex.encodeHexString(md5.digest()); + } catch (NoSuchAlgorithmException e) { + log.warn("getMd5 fail = {}",e.getMessage()); + } + return content; + } +} diff --git a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileDao.java b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileDao.java index 8da293e..e009589 100644 --- a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileDao.java +++ b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileDao.java @@ -13,4 +13,10 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface FileDao extends IService { + /** + * 根据url md5获取文件信息 + * @param urlMd5 + * @return + */ + File getFileByUrlMd5(String urlMd5); } diff --git a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileDaoImpl.java b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileDaoImpl.java index 83924b6..bd5c4fe 100644 --- a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileDaoImpl.java +++ b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileDaoImpl.java @@ -1,5 +1,7 @@ package cn.axzo.oss.dal.repository.impl; +import cn.axzo.oss.common.constans.CommonConstants; +import cn.axzo.oss.common.constans.CommonConstants.TableDelete; import cn.axzo.oss.dal.entity.File; import cn.axzo.oss.dal.mapper.FileMapper; import cn.axzo.oss.dal.repository.FileDao; @@ -17,4 +19,9 @@ import org.springframework.stereotype.Repository; @Repository("fileDao") public class FileDaoImpl extends ServiceImpl implements FileDao { + @Override + public File getFileByUrlMd5(String urlMd5) { + return lambdaQuery().eq(File::getUrlMd5, urlMd5).eq(File::getIsDelete, TableDelete.UN_DELETE) + .last("limit 1").one(); + } } diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileDeleteRequest.java b/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileDeleteRequest.java index 5c7e07c..7bc9314 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileDeleteRequest.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileDeleteRequest.java @@ -17,6 +17,4 @@ public class ServerFileDeleteRequest { @NotBlank(message = "url must not be null") private String url; - private String appCode; - } diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/base/BaseS3Service.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/base/BaseS3Service.java new file mode 100644 index 0000000..464f6a1 --- /dev/null +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/base/BaseS3Service.java @@ -0,0 +1,13 @@ +package cn.axzo.oss.integration.s3.base; + +/** + * @Author admin + * @Description + * @Date 2021/7/28 23:46 + * @Version 0.0.1 + **/ +public interface BaseS3Service { + int RECORD_LIMIT = 100; + // ttl 15m; 60 * 15 = 900s + int DEFAULT_TTL_S = 900; +} diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java new file mode 100644 index 0000000..7237a23 --- /dev/null +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java @@ -0,0 +1,14 @@ +package cn.axzo.oss.manager.api; + +import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; + +/** + * @Author admin + * @Description + * @Date 2021/7/28 22:48 + * @Version 0.0.1 + **/ +public interface FileManager { + + boolean delete(ServerFileDeleteDto dto); +} diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileDeleteDto.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileDeleteDto.java new file mode 100644 index 0000000..87ac31e --- /dev/null +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileDeleteDto.java @@ -0,0 +1,15 @@ +package cn.axzo.oss.manager.api.dto.request; + +import lombok.Data; + +/** + * @Author admin + * @Description + * @Date 2021/7/28 22:50 + * @Version 0.0.1 + **/ +@Data +public class ServerFileDeleteDto { + private String url; + private String operator; +} diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/response/ServerFileDeleteResponse.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/response/ServerFileDeleteResponse.java new file mode 100644 index 0000000..83b4ee5 --- /dev/null +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/response/ServerFileDeleteResponse.java @@ -0,0 +1,11 @@ +package cn.axzo.oss.manager.api.dto.response; + +/** + * @Author admin + * @Description + * @Date 2021/7/28 22:51 + * @Version 0.0.1 + **/ +public class ServerFileDeleteResponse { + +} diff --git a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java new file mode 100644 index 0000000..382212c --- /dev/null +++ b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java @@ -0,0 +1,24 @@ +package cn.axzo.oss.manager.impl; + +import cn.axzo.oss.dal.repository.FileDao; +import cn.axzo.oss.manager.api.FileManager; +import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @Author admin + * @Description + * @Date 2021/7/28 22:48 + * @Version 0.0.1 + **/ +@Service +@Slf4j +public class FileManagerImpl implements FileManager { + + @Override + public boolean delete(ServerFileDeleteDto dto) { +return Boolean.TRUE; + } +} diff --git a/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java b/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java new file mode 100644 index 0000000..13b31a2 --- /dev/null +++ b/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java @@ -0,0 +1,18 @@ +package cn.axzo.oss.service.api; + +import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; + +/** + * @Author admin + * @Description + * @Date 2021/7/28 22:48 + * @Version 0.0.1 + **/ +public interface FileService { + + /** + * 删除文件 + * @param dto + */ + void delete(ServerFileDeleteDto dto); +} diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java new file mode 100644 index 0000000..0f2852b --- /dev/null +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java @@ -0,0 +1,61 @@ +package cn.axzo.oss.service.impl; + +import cn.axzo.oss.common.constans.CommonConstants.TableDelete; +import cn.axzo.oss.common.utils.JsonUtil; +import cn.axzo.oss.common.utils.Utility; +import cn.axzo.oss.dal.entity.File; +import cn.axzo.oss.dal.repository.FileDao; +import cn.axzo.oss.manager.api.FileManager; +import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; +import cn.axzo.oss.service.api.FileService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @Author admin + * @Description + * @Date 2021/7/28 22:48 + * @Version 0.0.1 + **/ +@Service +@Slf4j +public class FileServiceImpl implements FileService { + + private final FileManager fileManager; + + private final FileDao fileDao; + + public FileServiceImpl(FileManager fileManager, FileDao fileDao) { + this.fileManager = fileManager; + this.fileDao = fileDao; + } + + /** + * 删除文件 + * @param dto + */ + @Override + public void delete(ServerFileDeleteDto dto) { + log.info("delete dto = {}", JsonUtil.obj2Str(dto)); + if (Utility.isBlank(dto.getUrl())){ + log.warn("delete url is null"); + return; + } + String urlMd5 = Utility.getMd5(dto.getUrl()); + log.info("delete urlMd5 = {}", urlMd5); + File file = fileDao.getFileByUrlMd5(urlMd5); + if (Utility.objIsNull(file)){ + log.warn("delete file is null, urlMd5 = {}", urlMd5); + return; + } + boolean deleteFlag = fileManager.delete(dto); + log.info("delete deleteFlag = {}", deleteFlag); + if (deleteFlag){ + file.setIsDelete(TableDelete.DELETE); + file.setUpdateBy(dto.getOperator()); + file.setUpdateAt(null); + fileDao.updateById(file); + } + } +} diff --git a/pom.xml b/pom.xml index 39ffefb..1ab4c50 100644 --- a/pom.xml +++ b/pom.xml @@ -37,6 +37,7 @@ 2.0 2.2.1.RELEASE Hoxton.SR6 + 1.10 @@ -157,6 +158,11 @@ xxl-job-core ${xxl.job.version} + + commons-codec + commons-codec + ${commons-codec.version} + From 58882e88119c46c6bd5033f85dc9bbecc1e363a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9C=E8=A2=81=E6=9D=B0=E2=80=9D?= <“yuanjie@zhiyoutec.com”> Date: Thu, 29 Jul 2021 19:55:37 +0800 Subject: [PATCH 06/31] =?UTF-8?q?fix:=E5=AE=8C=E5=96=84=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=BB=A5=E5=8F=8Aoss=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AF=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ServerFileController.java | 13 +-- .../handler/ControllerExceptionHandler.java | 74 +++++++++++++++ .../oss/common/constans/CommonConstants.java | 26 ++++++ .../cn/axzo/oss/common/enums/CodeEnum.java | 41 +++++++++ .../oss/common/exception/BizException.java | 90 +++++++++++++++++++ .../oss/common/exception/S3Exception.java | 43 +++++++++ .../cn/axzo/oss/common/utils/Utility.java | 3 + .../oss/dal/repository/impl/FileDaoImpl.java | 4 +- oss-integration/pom.xml | 6 +- .../oss/integration/s3/AliOssService.java | 13 +++ .../integration/s3/base/BaseS3Service.java | 41 +++++++++ .../integration/s3/base/OssClientBase.java | 15 ++++ .../integration/s3/client/AliOssClient.java | 50 +++++++++++ .../integration/s3/config/AliOssConfig.java | 35 ++++++++ .../s3/impl/AliOssServiceImpl.java | 84 +++++++++++++++++ .../cn/axzo/oss/manager/api/FileManager.java | 4 +- .../api/dto/request/ServerFileUploadDto.java | 11 +++ .../oss/manager/impl/FileManagerImpl.java | 11 ++- .../oss/service/impl/FileServiceImpl.java | 17 ++-- .../cn/axzo/oss/test/FileServiceTest.java | 28 ++++++ .../cn/axzo/oss/test/base/SpringTestBase.java | 18 ++++ pom.xml | 6 ++ 22 files changed, 610 insertions(+), 23 deletions(-) create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/handler/ControllerExceptionHandler.java create mode 100644 oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java create mode 100644 oss-common/src/main/java/cn/axzo/oss/common/exception/BizException.java create mode 100644 oss-common/src/main/java/cn/axzo/oss/common/exception/S3Exception.java create mode 100644 oss-integration/src/main/java/cn/axzo/oss/integration/s3/AliOssService.java create mode 100644 oss-integration/src/main/java/cn/axzo/oss/integration/s3/base/OssClientBase.java create mode 100644 oss-integration/src/main/java/cn/axzo/oss/integration/s3/client/AliOssClient.java create mode 100644 oss-integration/src/main/java/cn/axzo/oss/integration/s3/config/AliOssConfig.java create mode 100644 oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/AliOssServiceImpl.java create mode 100644 oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileUploadDto.java create mode 100644 oss-test/src/test/java/cn/axzo/oss/test/FileServiceTest.java create mode 100644 oss-test/src/test/java/cn/axzo/oss/test/base/SpringTestBase.java diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java index 547b533..fbf4737 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java @@ -8,6 +8,7 @@ import cn.axzo.oss.http.model.ServerFileUploadResponse; import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; import cn.axzo.oss.service.api.FileService; import cn.azxo.framework.common.model.CommonResponse; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @@ -23,17 +24,19 @@ import javax.validation.Valid; @RestController public class ServerFileController implements ServerFileServiceApi { - private final FileService fileService; - - public ServerFileController(FileService fileService) { - this.fileService = fileService; - } + @Autowired + private FileService fileService; @Override public CommonResponse upload(@Valid @RequestBody ServerFileUploadRequest request) { return null; } + /** + * 根据文件url删除文件 + * @param request + * @return + */ @Override public CommonResponse delete(@Valid @RequestBody ServerFileDeleteRequest request) { ServerFileDeleteDto dto = BeanConvertUtil.copyBean(request, ServerFileDeleteDto.class); diff --git a/oss-client/src/main/java/cn/axzo/oss/client/handler/ControllerExceptionHandler.java b/oss-client/src/main/java/cn/axzo/oss/client/handler/ControllerExceptionHandler.java new file mode 100644 index 0000000..ceb8e78 --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/handler/ControllerExceptionHandler.java @@ -0,0 +1,74 @@ +package cn.axzo.oss.client.handler; + +import cn.axzo.oss.common.enums.CodeEnum; +import cn.axzo.oss.common.exception.BizException; +import cn.axzo.oss.common.exception.S3Exception; +import cn.azxo.framework.common.model.CommonResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.validation.BindingResult; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +/** + * @program: oss + * @description: 全局异常捕捉 + * @author: mr.jie + * @date: 2021-07-29 19:51 + **/ +@Slf4j +@RestControllerAdvice +public class ControllerExceptionHandler { + + @ExceptionHandler(value = BizException.class) + public CommonResponse bizException(BizException e){ + log.warn("[oss] ControllerExceptionHandler.bizException Exception", e); + return CommonResponse.error(e.getCode(), e.getMessage()); + } + + @ExceptionHandler(value = S3Exception.class) + public CommonResponse bizException(S3Exception e){ + log.warn("[oss] ControllerExceptionHandler.s3Exception Exception", e); + return CommonResponse.error(e.getCode(), e.getMessage()); + } + + @ExceptionHandler(value = IllegalArgumentException.class) + public CommonResponse handleIllegalArgumentException(IllegalArgumentException e) { + log.error("[oss] ControllerExceptionHandler.handleIllegalArgumentException Exception message ", e); + return CommonResponse.error(CodeEnum.INVALID_PARAMETER.getCode(), e.getMessage()); + } + + @ExceptionHandler(value = DuplicateKeyException.class) + public CommonResponse handleDuplicateKeyException(DuplicateKeyException e) { + log.error("[oss] ControllerExceptionHandler.handleDuplicateKeyException Exception message ", e); + return CommonResponse.error(CodeEnum.REPEATED_REQUEST.getCode(), e.getCause().getMessage()); + } + + @ExceptionHandler(value = Exception.class) + public CommonResponse handleOtherException(Exception e) { + log.error("[oss] ControllerExceptionHandler.handleOtherException Exception", e); + return CommonResponse.error(CodeEnum.SYSTEM_ERROR.getCode(), CodeEnum.SYSTEM_ERROR.getMessage()); + } + + @ExceptionHandler(value = Throwable.class) + public CommonResponse handleThrowableException(Throwable e) { + log.error("[oss] ControllerExceptionHandler.handleThrowableException Exception", e); + return CommonResponse.error(CodeEnum.SYSTEM_ERROR.getCode(), CodeEnum.SYSTEM_ERROR.getMessage()); + } + + @ExceptionHandler(value = MethodArgumentNotValidException.class) + public CommonResponse handleArgumentValidException(MethodArgumentNotValidException e){ + log.warn("[oss] ControllerExceptionHandler.handleArgumentValidException Exception", e.getMessage()); + BindingResult bindingResult = e.getBindingResult(); + StringBuilder errorMsg = new StringBuilder(); + for (FieldError fieldError : bindingResult.getFieldErrors()) { + if (-1 == errorMsg.indexOf(fieldError.getDefaultMessage())) { + errorMsg.append(fieldError.getDefaultMessage()).append(","); + } + } + errorMsg.deleteCharAt(errorMsg.length() - 1); + return CommonResponse.error(CodeEnum.INVALID_PARAMETER.getCode(), errorMsg.toString()); + } +} diff --git a/oss-common/src/main/java/cn/axzo/oss/common/constans/CommonConstants.java b/oss-common/src/main/java/cn/axzo/oss/common/constans/CommonConstants.java index 7de66a0..ffa8981 100644 --- a/oss-common/src/main/java/cn/axzo/oss/common/constans/CommonConstants.java +++ b/oss-common/src/main/java/cn/axzo/oss/common/constans/CommonConstants.java @@ -16,4 +16,30 @@ public abstract class CommonConstants { Integer UN_DELETE = 0; Integer DELETE = 1; } + + /** + * 文件状态 + */ + public interface FileStatus { + + /** + * 处理中 + */ + Integer PROCESSING = 0; + + /** + * 上传成功 + */ + Integer SUCCESS = 1; + + /** + * 上传失败 + */ + Integer FAIL = 2; + + /** + * 已删除 + */ + Integer DELETED = 3; + } } diff --git a/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java b/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java new file mode 100644 index 0000000..c2db033 --- /dev/null +++ b/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java @@ -0,0 +1,41 @@ +package cn.axzo.oss.common.enums; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * 系统返回码枚举类 + * + * @author zhaoyong_sh + * @see CodeEnum + * @since 2021-05-17 15:57 + */ +@RequiredArgsConstructor +@Getter +public enum CodeEnum implements EnumBase { + + /** + * 系统返回码枚举类 + */ + SUCCESS(200, "success"), + SYSTEM_ERROR(500, "system error"), + FAIL(400, "service exception"), + + /** + * 0-100 系统相关 错误码 + */ + INVALID_PARAMETER(1, "无效的参数"), + REPEATED_REQUEST(2, "重复的请求"), + + /** + * 101-200 业务场景 + */ + S3_CLIENT_NULL(101,"oss client is null") + + ; + + private final Integer code; + + private final String message; + +} \ No newline at end of file diff --git a/oss-common/src/main/java/cn/axzo/oss/common/exception/BizException.java b/oss-common/src/main/java/cn/axzo/oss/common/exception/BizException.java new file mode 100644 index 0000000..df3cb55 --- /dev/null +++ b/oss-common/src/main/java/cn/axzo/oss/common/exception/BizException.java @@ -0,0 +1,90 @@ +package cn.axzo.oss.common.exception; + +import cn.axzo.oss.common.enums.CodeEnum; +import lombok.Getter; +import lombok.Setter; + +/** + * 业务异常 + * + * @author zhaoyong_sh + * @see BizException + * @since 2021-05-17 15:56 + */ +@Getter +@Setter +public class BizException extends RuntimeException { + + private Integer code; + + private String message; + + /** + * 需返回的业务数据 + */ + private Object data; + + public BizException(Integer code) { + this.code = code; + } + + public BizException(CodeEnum returnCode) { + super(returnCode.getMessage()); + this.code = returnCode.getCode(); + this.message = returnCode.getMessage(); + } + + public BizException(CodeEnum returnCode, String message) { + super(returnCode.getMessage()); + this.code = returnCode.getCode(); + this.message = message; + } + + public BizException(Integer code, Throwable cause) { + super(null, cause); + this.code = code; + } + + public BizException(Integer code, String message, Object data) { + super(message); + this.code = code; + this.message = message; + this.data = data; + } + + public BizException(Integer code, String message, Object data, Throwable cause) { + super(message, cause); + this.code = code; + this.message = message; + this.data = data; + } + + public static void error(boolean b, CodeEnum returnCode) { + if (!b) { + throw new BizException(returnCode.getCode(), returnCode.getMessage(), null); + } + } + + public static void error(boolean b, CodeEnum returnCode, String message) { + if (!b) { + throw new BizException(returnCode.getCode(), message, null); + } + } + + public static void error(boolean b, Integer code, String message) { + if (!b) { + throw new BizException(code, message, null); + } + } + + public static void error(boolean b, Integer code, String message, Object data) { + if (!b) { + throw new BizException(code, message, data); + } + } + + public static void error(CodeEnum returnCode) { + throw new BizException(returnCode.getCode(), returnCode.getMessage(), null); + } + +} diff --git a/oss-common/src/main/java/cn/axzo/oss/common/exception/S3Exception.java b/oss-common/src/main/java/cn/axzo/oss/common/exception/S3Exception.java new file mode 100644 index 0000000..5593e15 --- /dev/null +++ b/oss-common/src/main/java/cn/axzo/oss/common/exception/S3Exception.java @@ -0,0 +1,43 @@ +package cn.axzo.oss.common.exception; + +/** + * @program: oss + * @description: 文件上传异常 + * @author: mr.jie + * @date: 2021-07-29 19:28 + **/ +public class S3Exception extends RuntimeException { + + private Integer code; + + private String msg; + + public S3Exception(Integer code, String msg) { + this.code = code; + this.msg = msg; + } + + public void setCode(Integer code) { + this.code = code; + } + + public Integer getCode() { + return code; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public String getMsg() { + return msg; + } + + @Override + public String toString() { + return "S3Exception{" + + "code=" + code + + ", msg='" + msg + '\'' + + '}'; + } +} diff --git a/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java b/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java index 3ee13e7..8b7e535 100644 --- a/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java +++ b/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java @@ -1,5 +1,8 @@ package cn.axzo.oss.common.utils; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; diff --git a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileDaoImpl.java b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileDaoImpl.java index bd5c4fe..a18eac5 100644 --- a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileDaoImpl.java +++ b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileDaoImpl.java @@ -1,6 +1,6 @@ package cn.axzo.oss.dal.repository.impl; -import cn.axzo.oss.common.constans.CommonConstants; +import cn.axzo.oss.common.constans.CommonConstants.FileStatus; import cn.axzo.oss.common.constans.CommonConstants.TableDelete; import cn.axzo.oss.dal.entity.File; import cn.axzo.oss.dal.mapper.FileMapper; @@ -21,7 +21,7 @@ public class FileDaoImpl extends ServiceImpl implements FileDa @Override public File getFileByUrlMd5(String urlMd5) { - return lambdaQuery().eq(File::getUrlMd5, urlMd5).eq(File::getIsDelete, TableDelete.UN_DELETE) + return lambdaQuery().eq(File::getUrlMd5, urlMd5).eq(File::getStatus, FileStatus.SUCCESS).eq(File::getIsDelete, TableDelete.UN_DELETE) .last("limit 1").one(); } } diff --git a/oss-integration/pom.xml b/oss-integration/pom.xml index 969c205..28db6e2 100644 --- a/oss-integration/pom.xml +++ b/oss-integration/pom.xml @@ -19,7 +19,11 @@ org.springframework.cloud spring-cloud-starter-openfeign - + + com.aliyun.oss + aliyun-sdk-oss + + diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/AliOssService.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/AliOssService.java new file mode 100644 index 0000000..8808762 --- /dev/null +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/AliOssService.java @@ -0,0 +1,13 @@ +package cn.axzo.oss.integration.s3; + +import cn.axzo.oss.integration.s3.base.BaseS3Service; + +/** + * @program: oss + * @description: 阿里云oss服务 + * @author: mr.jie + * @date: 2021-07-29 15:44 + **/ +public interface AliOssService extends BaseS3Service { + +} diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/base/BaseS3Service.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/base/BaseS3Service.java index 464f6a1..7ed1484 100644 --- a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/base/BaseS3Service.java +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/base/BaseS3Service.java @@ -1,5 +1,10 @@ package cn.axzo.oss.integration.s3.base; +import java.io.FilterInputStream; +import java.io.InputStream; +import org.springframework.http.ResponseEntity; +import org.springframework.web.multipart.MultipartFile; + /** * @Author admin * @Description @@ -7,7 +12,43 @@ package cn.axzo.oss.integration.s3.base; * @Version 0.0.1 **/ public interface BaseS3Service { + int RECORD_LIMIT = 100; // ttl 15m; 60 * 15 = 900s int DEFAULT_TTL_S = 900; + + /** + * upload file + */ + boolean uploadByStream(InputStream srcStream, String tgtFileKey); + + + /** + * upload multi file + */ + boolean uploadMultiFile(MultipartFile[] multipartFiles); + + /** + * delete file + */ + boolean delFile(String bucket, String tgtFileKey); + + + /** + * download file + */ + ResponseEntity download(String tgtFileKey); + + /** + * get file address + * + * @param ttl second + */ + String getFileAddress(String tgtFileKey, int ttl); + + /** + * get S3Object stream + */ + FilterInputStream getS3ObjectStream(String tgtFileKey); + } diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/base/OssClientBase.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/base/OssClientBase.java new file mode 100644 index 0000000..a1e11ee --- /dev/null +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/base/OssClientBase.java @@ -0,0 +1,15 @@ +package cn.axzo.oss.integration.s3.base; + +/** + * @program: oss + * @description: 客户端接口 + * @author: mr.jie + * @date: 2021-07-29 18:07 + **/ +public interface OssClientBase { + + Object getClient(); + + void initClient(); + +} diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/client/AliOssClient.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/client/AliOssClient.java new file mode 100644 index 0000000..92e8944 --- /dev/null +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/client/AliOssClient.java @@ -0,0 +1,50 @@ +package cn.axzo.oss.integration.s3.client; + + +import cn.axzo.oss.common.enums.CodeEnum; +import cn.axzo.oss.common.exception.S3Exception; +import cn.axzo.oss.common.utils.Utility; +import cn.axzo.oss.integration.s3.base.OssClientBase; +import cn.axzo.oss.integration.s3.config.AliOssConfig; +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClientBuilder; +import javax.annotation.PostConstruct; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * @program: oss + * @description: 阿里云服务客户端 + * @author: mr.jie + * @date: 2021-07-29 15:49 + **/ +@Component +@Slf4j +public class AliOssClient implements OssClientBase { + private volatile static OSS instance = null; + + @Autowired + private AliOssConfig aliOssConfig; + + public OSS getClient(){ + if (Utility.objIsNull(instance)){ + throw new S3Exception(CodeEnum.S3_CLIENT_NULL.getCode(),"oss客户端未初始化"); + } + return instance; + } + + + @PostConstruct + @Override + public void initClient(){ + log.info("initClient endpoint = {}, accessKeyId = {},secretAccessKey = {}", aliOssConfig.getEndpoint(),aliOssConfig.getAccessKeyId(),aliOssConfig.getSecretAccessKey()); + try { + instance = new OSSClientBuilder().build(aliOssConfig.getEndpoint(),aliOssConfig.getAccessKeyId(),aliOssConfig.getSecretAccessKey()); + } catch (Exception e) { + instance = null; + log.error("initClient error = {}", e); + } + } + +} diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/config/AliOssConfig.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/config/AliOssConfig.java new file mode 100644 index 0000000..8851f93 --- /dev/null +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/config/AliOssConfig.java @@ -0,0 +1,35 @@ +package cn.axzo.oss.integration.s3.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +/** + * @program: oss + * @description: 阿里云配置 + * @author: mr.jie + * @date: 2021-07-29 17:57 + **/ +@Component +public class AliOssConfig { + + @Value("${aliyun.oss.accessKeyId}") + private String ACCESS_KEY_ID; + + @Value("${aliyun.oss.secretAccessKey}") + private String SECRET_ACCESS_KEY; + + @Value("${aliyun.oss.endpoint}") + private String ENDPOINT; + + public String getAccessKeyId(){ + return this.ACCESS_KEY_ID; + } + + public String getSecretAccessKey(){ + return this.SECRET_ACCESS_KEY; + } + + public String getEndpoint(){ + return this.ENDPOINT; + } +} diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/AliOssServiceImpl.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/AliOssServiceImpl.java new file mode 100644 index 0000000..80d5c38 --- /dev/null +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/AliOssServiceImpl.java @@ -0,0 +1,84 @@ +package cn.axzo.oss.integration.s3.impl; + +import cn.axzo.oss.integration.s3.AliOssService; +import cn.axzo.oss.integration.s3.client.AliOssClient; +import com.aliyun.oss.ClientException; +import com.aliyun.oss.OSSException; +import java.io.FilterInputStream; +import java.io.InputStream; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +/** + * @program: oss + * @description: 阿里oss服务 + * @author: mr.jie + * @date: 2021-07-29 15:45 + **/ +@Service +@Slf4j +public class AliOssServiceImpl implements AliOssService { + + @Autowired + private AliOssClient aliOssClient; + + /** + * upload file + */ + @Override + public boolean uploadByStream(InputStream srcStream, String tgtFileKey) { + return false; + } + + /** + * upload multi file + */ + @Override + public boolean uploadMultiFile(MultipartFile[] multipartFiles) { + return false; + } + + /** + * delete file + */ + @Override + public boolean delFile(String bucket, String tgtFileKey) { + log.debug("ali oss delFile bucket = {}, tatFileKey = {}", bucket, tgtFileKey); + try { + aliOssClient.getClient().deleteObject(bucket, tgtFileKey); + return Boolean.TRUE; + } catch (Exception e) { + log.error("ali oss delFile error = {}",e); + } + return Boolean.FALSE; + } + + /** + * download file + */ + @Override + public ResponseEntity download(String tgtFileKey) { + return null; + } + + /** + * get file address + * + * @param ttl second + */ + @Override + public String getFileAddress(String tgtFileKey, int ttl) { + return null; + } + + /** + * get S3Object stream + */ + @Override + public FilterInputStream getS3ObjectStream(String tgtFileKey) { + return null; + } +} diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java index 7237a23..e005638 100644 --- a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java @@ -1,6 +1,6 @@ package cn.axzo.oss.manager.api; -import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; +import cn.axzo.oss.dal.entity.File; /** * @Author admin @@ -10,5 +10,5 @@ import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; **/ public interface FileManager { - boolean delete(ServerFileDeleteDto dto); + boolean delete(File file); } diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileUploadDto.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileUploadDto.java new file mode 100644 index 0000000..783a9a7 --- /dev/null +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileUploadDto.java @@ -0,0 +1,11 @@ +package cn.axzo.oss.manager.api.dto.request; + +/** + * @program: oss + * @description: 文件上传 + * @author: mr.jie + * @date: 2021-07-29 18:31 + **/ +public class ServerFileUploadDto { + +} diff --git a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java index 382212c..af0023e 100644 --- a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java +++ b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java @@ -1,8 +1,8 @@ package cn.axzo.oss.manager.impl; -import cn.axzo.oss.dal.repository.FileDao; +import cn.axzo.oss.dal.entity.File; +import cn.axzo.oss.integration.s3.AliOssService; import cn.axzo.oss.manager.api.FileManager; -import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -17,8 +17,11 @@ import org.springframework.stereotype.Service; @Slf4j public class FileManagerImpl implements FileManager { + @Autowired + private AliOssService aliOssService; + @Override - public boolean delete(ServerFileDeleteDto dto) { -return Boolean.TRUE; + public boolean delete(File file) { + return aliOssService.delFile(file.getBucketName(), file.getFileUuid()); } } diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java index 0f2852b..9c59f62 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java @@ -1,5 +1,6 @@ package cn.axzo.oss.service.impl; +import cn.axzo.oss.common.constans.CommonConstants.FileStatus; import cn.axzo.oss.common.constans.CommonConstants.TableDelete; import cn.axzo.oss.common.utils.JsonUtil; import cn.axzo.oss.common.utils.Utility; @@ -22,14 +23,11 @@ import org.springframework.stereotype.Service; @Slf4j public class FileServiceImpl implements FileService { - private final FileManager fileManager; + @Autowired + private FileManager fileManager; - private final FileDao fileDao; - - public FileServiceImpl(FileManager fileManager, FileDao fileDao) { - this.fileManager = fileManager; - this.fileDao = fileDao; - } + @Autowired + private FileDao fileDao; /** * 删除文件 @@ -46,13 +44,14 @@ public class FileServiceImpl implements FileService { log.info("delete urlMd5 = {}", urlMd5); File file = fileDao.getFileByUrlMd5(urlMd5); if (Utility.objIsNull(file)){ - log.warn("delete file is null, urlMd5 = {}", urlMd5); + log.warn("delete file is null,url = {}, urlMd5 = {}", dto.getUrl(), urlMd5); return; } - boolean deleteFlag = fileManager.delete(dto); + boolean deleteFlag = fileManager.delete(file); log.info("delete deleteFlag = {}", deleteFlag); if (deleteFlag){ file.setIsDelete(TableDelete.DELETE); + file.setStatus(FileStatus.DELETED); file.setUpdateBy(dto.getOperator()); file.setUpdateAt(null); fileDao.updateById(file); diff --git a/oss-test/src/test/java/cn/axzo/oss/test/FileServiceTest.java b/oss-test/src/test/java/cn/axzo/oss/test/FileServiceTest.java new file mode 100644 index 0000000..d1d4395 --- /dev/null +++ b/oss-test/src/test/java/cn/axzo/oss/test/FileServiceTest.java @@ -0,0 +1,28 @@ +package cn.axzo.oss.test; + +import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; +import cn.axzo.oss.service.api.FileService; +import cn.axzo.oss.test.base.SpringTestBase; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @program: oss + * @description: 文件服务测试 + * @author: mr.jie + * @date: 2021-07-29 18:42 + **/ +public class FileServiceTest extends SpringTestBase { + + @Autowired + private FileService fileService; + + @Test + public void deleteTest(){ + ServerFileDeleteDto dto = new ServerFileDeleteDto(); + dto.setUrl("https://axzo-pro.oss-cn-hangzhou.aliyuncs.com/stable/face/19700101080046_6296.jpg"); + dto.setOperator("zhangsan"); + fileService.delete(dto); + } + +} diff --git a/oss-test/src/test/java/cn/axzo/oss/test/base/SpringTestBase.java b/oss-test/src/test/java/cn/axzo/oss/test/base/SpringTestBase.java new file mode 100644 index 0000000..60787f6 --- /dev/null +++ b/oss-test/src/test/java/cn/axzo/oss/test/base/SpringTestBase.java @@ -0,0 +1,18 @@ +package cn.axzo.oss.test.base; + +import cn.axzo.oss.client.Bootstrap; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * @program: oss + * @description: 测试基础 + * @author: mr.jie + * @date: 2021-07-29 18:43 + **/ +@SpringBootTest(classes = Bootstrap.class) +@RunWith(SpringJUnit4ClassRunner.class) +public class SpringTestBase { + +} diff --git a/pom.xml b/pom.xml index 1ab4c50..6b5551c 100644 --- a/pom.xml +++ b/pom.xml @@ -38,6 +38,7 @@ 2.2.1.RELEASE Hoxton.SR6 1.10 + 3.10.2 @@ -163,6 +164,11 @@ commons-codec ${commons-codec.version} + + com.aliyun.oss + aliyun-sdk-oss + ${aliyun-oss.version} + From 79ac87c5ed215948bab9b36e24bebe6009eb5438 Mon Sep 17 00:00:00 2001 From: zhangran Date: Thu, 29 Jul 2021 21:29:56 +0800 Subject: [PATCH 07/31] =?UTF-8?q?add-=E6=B7=BB=E5=8A=A0=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ServerFileController.java | 3 +++ .../api/dto/request/ServerFileUploadDto.java | 10 ++++++- .../cn/axzo/oss/service/api/FileService.java | 9 +++++++ .../oss/service/impl/FileServiceImpl.java | 27 ++++++++++++++++--- 4 files changed, 45 insertions(+), 4 deletions(-) diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java index fbf4737..e387220 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java @@ -6,6 +6,7 @@ import cn.axzo.oss.http.model.ServerFileDeleteRequest; import cn.axzo.oss.http.model.ServerFileUploadRequest; import cn.axzo.oss.http.model.ServerFileUploadResponse; import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; +import cn.axzo.oss.manager.api.dto.request.ServerFileUploadDto; import cn.axzo.oss.service.api.FileService; import cn.azxo.framework.common.model.CommonResponse; import org.springframework.beans.factory.annotation.Autowired; @@ -29,6 +30,8 @@ public class ServerFileController implements ServerFileServiceApi { @Override public CommonResponse upload(@Valid @RequestBody ServerFileUploadRequest request) { + ServerFileUploadDto dto = BeanConvertUtil.copyBean(request, ServerFileUploadDto.class); + fileService.update(dto); return null; } diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileUploadDto.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileUploadDto.java index 783a9a7..c290db6 100644 --- a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileUploadDto.java +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileUploadDto.java @@ -1,11 +1,19 @@ package cn.axzo.oss.manager.api.dto.request; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import lombok.Data; + /** * @program: oss * @description: 文件上传 * @author: mr.jie * @date: 2021-07-29 18:31 **/ +@Data public class ServerFileUploadDto { - + private String appCode; + private String bizScene; + private String fileName; + private byte[] fileContent; } diff --git a/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java b/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java index 13b31a2..ae5da6c 100644 --- a/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java +++ b/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java @@ -1,6 +1,7 @@ package cn.axzo.oss.service.api; import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; +import cn.axzo.oss.manager.api.dto.request.ServerFileUploadDto; /** * @Author admin @@ -12,7 +13,15 @@ public interface FileService { /** * 删除文件 + * * @param dto */ void delete(ServerFileDeleteDto dto); + + /** + * 上传 + * + * @param request + */ + void update(ServerFileUploadDto request); } diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java index 9c59f62..8396c57 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java @@ -8,7 +8,9 @@ import cn.axzo.oss.dal.entity.File; import cn.axzo.oss.dal.repository.FileDao; import cn.axzo.oss.manager.api.FileManager; import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; +import cn.axzo.oss.manager.api.dto.request.ServerFileUploadDto; import cn.axzo.oss.service.api.FileService; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -31,25 +33,26 @@ public class FileServiceImpl implements FileService { /** * 删除文件 + * * @param dto */ @Override public void delete(ServerFileDeleteDto dto) { log.info("delete dto = {}", JsonUtil.obj2Str(dto)); - if (Utility.isBlank(dto.getUrl())){ + if (Utility.isBlank(dto.getUrl())) { log.warn("delete url is null"); return; } String urlMd5 = Utility.getMd5(dto.getUrl()); log.info("delete urlMd5 = {}", urlMd5); File file = fileDao.getFileByUrlMd5(urlMd5); - if (Utility.objIsNull(file)){ + if (Utility.objIsNull(file)) { log.warn("delete file is null,url = {}, urlMd5 = {}", dto.getUrl(), urlMd5); return; } boolean deleteFlag = fileManager.delete(file); log.info("delete deleteFlag = {}", deleteFlag); - if (deleteFlag){ + if (deleteFlag) { file.setIsDelete(TableDelete.DELETE); file.setStatus(FileStatus.DELETED); file.setUpdateBy(dto.getOperator()); @@ -57,4 +60,22 @@ public class FileServiceImpl implements FileService { fileDao.updateById(file); } } + + /** + * 上传 + * + * @param dto + */ + @Override + public void update(ServerFileUploadDto dto) { + log.info("update dto:{}", JSON.toJSONString(dto)); + /** + * 1.检查app + * 2.渠道 + * 3.渠道对应桶信息 + * 4.获取应用场景目录 + * 5.检查文件大小,格式 + * 6.上传至oss + */ + } } From dbb97bf20d22d05219e602d947708762a7866416 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9C=E8=A2=81=E6=9D=B0=E2=80=9D?= Date: Thu, 29 Jul 2021 23:31:52 +0800 Subject: [PATCH 08/31] =?UTF-8?q?fix:=E6=B7=BB=E5=8A=A0=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=96=87=E4=BB=B6md5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/oss/common/utils/Utility.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java b/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java index 8b7e535..03f78ef 100644 --- a/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java +++ b/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java @@ -3,12 +3,14 @@ package cn.axzo.oss.common.utils; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.nio.channels.FileChannel; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Objects; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.binary.Hex; +import org.apache.commons.codec.digest.DigestUtils; /** * @Author admin @@ -74,4 +76,21 @@ public class Utility { } return content; } + + /** + * 获取文件的MD5值 + * @param bytes + * @return + */ + public static String getMd5(byte [] bytes) { + try { + MessageDigest md5 = MessageDigest.getInstance("MD5"); + md5.reset(); + md5.update(bytes); + return Hex.encodeHexString(md5.digest()); + } catch (NoSuchAlgorithmException e) { + log.warn("getMd5 fail = {}",e.getMessage()); + } + return ""; + } } From fcf871394435a601d46a5d0454c4c19a18ffc08e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9C=E8=A2=81=E6=9D=B0=E2=80=9D?= <“yuanjie@zhiyoutec.com”> Date: Fri, 30 Jul 2021 10:13:53 +0800 Subject: [PATCH 09/31] fix:clear refs --- .../src/main/java/cn/axzo/oss/common/utils/Utility.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java b/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java index 03f78ef..25b4f95 100644 --- a/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java +++ b/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java @@ -1,16 +1,11 @@ package cn.axzo.oss.common.utils; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.channels.FileChannel; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Objects; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.binary.Hex; -import org.apache.commons.codec.digest.DigestUtils; /** * @Author admin From 9d69d0d72795c9610cd977f92654cbb483284fce Mon Sep 17 00:00:00 2001 From: zhangran <786752558@qq.com> Date: Sun, 1 Aug 2021 19:38:12 +0800 Subject: [PATCH 10/31] =?UTF-8?q?add-=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=89=8D=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ServerFileController.java | 2 +- .../cn/axzo/oss/common/enums/CodeEnum.java | 8 +- .../oss/common/enums/StorageUnitEnum.java | 43 ++++++++++ .../cn/axzo/oss/common/utils/Utility.java | 14 +++ .../dal/repository/AppChannelBucketDao.java | 8 ++ .../axzo/oss/dal/repository/FileAppDao.java | 7 ++ .../dal/repository/FileBusinessSceneDao.java | 8 ++ .../oss/dal/repository/FileChannelDao.java | 7 ++ .../dal/repository/FileUploadConfigDao.java | 8 ++ .../impl/AppChannelBucketDaoImpl.java | 16 +++- .../dal/repository/impl/FileAppDaoImpl.java | 14 +++ .../impl/FileBusinessSceneDaoImpl.java | 16 +++- .../repository/impl/FileChannelDaoImpl.java | 13 +++ .../impl/FileUploadConfigDaoImpl.java | 17 +++- .../cn/axzo/oss/service/api/FileService.java | 2 +- .../oss/service/impl/FileServiceImpl.java | 85 ++++++++++++++++++- 16 files changed, 261 insertions(+), 7 deletions(-) create mode 100644 oss-common/src/main/java/cn/axzo/oss/common/enums/StorageUnitEnum.java diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java index e387220..7e40698 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java @@ -31,7 +31,7 @@ public class ServerFileController implements ServerFileServiceApi { @Override public CommonResponse upload(@Valid @RequestBody ServerFileUploadRequest request) { ServerFileUploadDto dto = BeanConvertUtil.copyBean(request, ServerFileUploadDto.class); - fileService.update(dto); + fileService.upload(dto); return null; } diff --git a/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java b/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java index c2db033..b129aa2 100644 --- a/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java +++ b/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java @@ -30,7 +30,13 @@ public enum CodeEnum implements EnumBase { /** * 101-200 业务场景 */ - S3_CLIENT_NULL(101,"oss client is null") + S3_CLIENT_NULL(101,"oss client is null"), + APP_CODE_NOT_FOUND(102,"app code not found"), + APP_CHANNEL_BUCKET_NOT_FOUND(103,"channel bucket not found"), + APP_CHANNEL_NOT_FOUND(104,"channel not found"), + NO_CHANNELS_AVAILABLE(105,"no channels available"), + NO_UPLOAD_CONFIG(106,"no upload config"), + FILE_SIZE_EXCEEDS_LIMIT(107,"file size exceeds limit"), ; diff --git a/oss-common/src/main/java/cn/axzo/oss/common/enums/StorageUnitEnum.java b/oss-common/src/main/java/cn/axzo/oss/common/enums/StorageUnitEnum.java new file mode 100644 index 0000000..cedcbca --- /dev/null +++ b/oss-common/src/main/java/cn/axzo/oss/common/enums/StorageUnitEnum.java @@ -0,0 +1,43 @@ +package cn.axzo.oss.common.enums; + +import java.util.Arrays; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * @ClassName: cn.axzo.oss.common.enums + * @description: + * @author: + * @date: 2021/8/119:04 + **/ +@Getter +@RequiredArgsConstructor +public enum StorageUnitEnum { + + /** + * B + */ + B(1, "B"), + /** + * KB + */ + KB(B.size * 1024, "KB"), + /** + * MB + */ + MB(KB.size * 1024, "MB"), + /** + * GB + */ + GB(MB.size * 1024, "GB"), + ; + + + private final Integer size; + private final String unit; + + public static StorageUnitEnum value(String unit) { + return Arrays.stream(values()).filter(storageUnitEnum -> storageUnitEnum.getUnit().equals(unit)) + .findFirst().orElse(null); + } +} diff --git a/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java b/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java index 25b4f95..0253a39 100644 --- a/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java +++ b/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java @@ -1,5 +1,6 @@ package cn.axzo.oss.common.utils; +import cn.axzo.oss.common.enums.StorageUnitEnum; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; @@ -17,6 +18,7 @@ import org.apache.commons.codec.binary.Hex; @Slf4j public class Utility { + /** * 判断对象为null * @param obj @@ -88,4 +90,16 @@ public class Utility { } return ""; } + + /** + * 容量换算 + * @return + */ + public static int capacityConversion(int size, String storageUnit) { + StorageUnitEnum storageUnitEnum = StorageUnitEnum.valueOf(storageUnit); + if (objIsNull(storageUnitEnum)) { + return 0; + } + return storageUnitEnum.getSize() * size; + } } diff --git a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/AppChannelBucketDao.java b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/AppChannelBucketDao.java index d9db5c3..1319b72 100644 --- a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/AppChannelBucketDao.java +++ b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/AppChannelBucketDao.java @@ -2,6 +2,7 @@ package cn.axzo.oss.dal.repository; import cn.axzo.oss.dal.entity.AppChannelBucket; import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; /** *

@@ -13,4 +14,11 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface AppChannelBucketDao extends IService { + /** + * 通过appcode获取文件渠道桶信息 + * + * @param appCode appcode + * @return + */ + List getByAppCode(String appCode); } diff --git a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileAppDao.java b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileAppDao.java index 642606b..517210f 100644 --- a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileAppDao.java +++ b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileAppDao.java @@ -1,5 +1,6 @@ package cn.axzo.oss.dal.repository; +import cn.axzo.oss.dal.entity.File; import cn.axzo.oss.dal.entity.FileApp; import com.baomidou.mybatisplus.extension.service.IService; @@ -13,4 +14,10 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface FileAppDao extends IService { + /** + * 通过appCode获取应用信息 + * @param appCode + * @return + */ + FileApp getByAppCode(String appCode); } diff --git a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileBusinessSceneDao.java b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileBusinessSceneDao.java index 80078ec..7b2c8ea 100644 --- a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileBusinessSceneDao.java +++ b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileBusinessSceneDao.java @@ -13,4 +13,12 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface FileBusinessSceneDao extends IService { + /** + * 指定appcode文件业务场景 + * + * @param bucketNo 应用编码 + * @param bizScene + * @return + */ + FileBusinessScene getByBucketNoAndScene(String bucketNo, String bizScene); } diff --git a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileChannelDao.java b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileChannelDao.java index 28cfecd..379a7fb 100644 --- a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileChannelDao.java +++ b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileChannelDao.java @@ -2,6 +2,7 @@ package cn.axzo.oss.dal.repository; import cn.axzo.oss.dal.entity.FileChannel; import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; /** *

@@ -13,4 +14,10 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface FileChannelDao extends IService { + /** + * 通过channelCode获取最高优化级可用文件渠道 + * @param channelCodes + * @return + */ + List getByChannelCode(List channelCodes); } diff --git a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileUploadConfigDao.java b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileUploadConfigDao.java index 16e9364..7fb886b 100644 --- a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileUploadConfigDao.java +++ b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileUploadConfigDao.java @@ -13,4 +13,12 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface FileUploadConfigDao extends IService { + /** + * 通过渠道码和桶名称获取获取指定上传配置 + * + * @param bucketNo + * @param directory + * @return + */ + FileUploadConfig getByUploadConfig(String bucketNo, String directory); } diff --git a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/AppChannelBucketDaoImpl.java b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/AppChannelBucketDaoImpl.java index d9f2272..1f17e61 100644 --- a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/AppChannelBucketDaoImpl.java +++ b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/AppChannelBucketDaoImpl.java @@ -1,9 +1,11 @@ package cn.axzo.oss.dal.repository.impl; +import cn.axzo.oss.common.enums.IsDeleteEnum; import cn.axzo.oss.dal.entity.AppChannelBucket; import cn.axzo.oss.dal.mapper.AppChannelBucketMapper; import cn.axzo.oss.dal.repository.AppChannelBucketDao; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.List; import org.springframework.stereotype.Repository; /** @@ -15,6 +17,18 @@ import org.springframework.stereotype.Repository; * @since 2021-07-23 */ @Repository("appChannelBucketDao") -public class AppChannelBucketDaoImpl extends ServiceImpl implements AppChannelBucketDao { +public class AppChannelBucketDaoImpl extends + ServiceImpl implements AppChannelBucketDao { + /** + * 通过appcode获取文件渠道桶信息 + * + * @param appCode appcode + * @return + */ + @Override + public List getByAppCode(String appCode) { + return lambdaQuery().eq(AppChannelBucket::getAppCode, appCode) + .eq(AppChannelBucket::getIsDelete, IsDeleteEnum.NO.getCode()).list(); + } } diff --git a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileAppDaoImpl.java b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileAppDaoImpl.java index fce99b7..cf3850c 100644 --- a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileAppDaoImpl.java +++ b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileAppDaoImpl.java @@ -1,5 +1,6 @@ package cn.axzo.oss.dal.repository.impl; +import cn.axzo.oss.common.enums.IsDeleteEnum; import cn.axzo.oss.dal.entity.FileApp; import cn.axzo.oss.dal.mapper.FileAppMapper; import cn.axzo.oss.dal.repository.FileAppDao; @@ -17,4 +18,17 @@ import org.springframework.stereotype.Repository; @Repository("fileAppDao") public class FileAppDaoImpl extends ServiceImpl implements FileAppDao { + + /** + * 通过appCode获取应用信息 + * + * @param appCode + * @return + */ + @Override + public FileApp getByAppCode(String appCode) { + return lambdaQuery().eq(FileApp::getAppCode, appCode) + .eq(FileApp::getStatus, 1) + .eq(FileApp::getIsDelete, IsDeleteEnum.NO.getCode()).one(); + } } diff --git a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileBusinessSceneDaoImpl.java b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileBusinessSceneDaoImpl.java index 9cd9f12..51806ed 100644 --- a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileBusinessSceneDaoImpl.java +++ b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileBusinessSceneDaoImpl.java @@ -1,5 +1,6 @@ package cn.axzo.oss.dal.repository.impl; +import cn.axzo.oss.common.enums.IsDeleteEnum; import cn.axzo.oss.dal.entity.FileBusinessScene; import cn.axzo.oss.dal.mapper.FileBusinessSceneMapper; import cn.axzo.oss.dal.repository.FileBusinessSceneDao; @@ -15,6 +16,19 @@ import org.springframework.stereotype.Repository; * @since 2021-07-23 */ @Repository("fileBusinessSceneDao") -public class FileBusinessSceneDaoImpl extends ServiceImpl implements FileBusinessSceneDao { +public class FileBusinessSceneDaoImpl extends + ServiceImpl implements FileBusinessSceneDao { + /** + * 指定appcode文件业务场景 + * + * @param bucketNo + * @return + */ + @Override + public FileBusinessScene getByBucketNoAndScene(String bucketNo, String bizScen) { + return lambdaQuery().eq(FileBusinessScene::getAppChannelBucketNo, bucketNo) + .eq(FileBusinessScene::getBusinessScene,bizScen) + .eq(FileBusinessScene::getIsDelete, IsDeleteEnum.NO.getCode()).one(); + } } diff --git a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileChannelDaoImpl.java b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileChannelDaoImpl.java index 558d91d..6458b3a 100644 --- a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileChannelDaoImpl.java +++ b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileChannelDaoImpl.java @@ -4,6 +4,7 @@ import cn.axzo.oss.dal.entity.FileChannel; import cn.axzo.oss.dal.mapper.FileChannelMapper; import cn.axzo.oss.dal.repository.FileChannelDao; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.List; import org.springframework.stereotype.Repository; /** @@ -17,4 +18,16 @@ import org.springframework.stereotype.Repository; @Repository("fileChannelDao") public class FileChannelDaoImpl extends ServiceImpl implements FileChannelDao { + /** + * 通过channelCode获取多个可用文件渠道 + * + * @param channelCodes + * @return + */ + @Override + public List getByChannelCode(List channelCodes) { + return lambdaQuery().in(FileChannel::getChannelCode,channelCodes) + .eq(FileChannel::getStatus,1) + .orderByAsc(FileChannel::getPriority).list(); + } } diff --git a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileUploadConfigDaoImpl.java b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileUploadConfigDaoImpl.java index 24f506a..9557cff 100644 --- a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileUploadConfigDaoImpl.java +++ b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileUploadConfigDaoImpl.java @@ -1,5 +1,6 @@ package cn.axzo.oss.dal.repository.impl; +import cn.axzo.oss.common.enums.IsDeleteEnum; import cn.axzo.oss.dal.entity.FileUploadConfig; import cn.axzo.oss.dal.mapper.FileUploadConfigMapper; import cn.axzo.oss.dal.repository.FileUploadConfigDao; @@ -15,6 +16,20 @@ import org.springframework.stereotype.Repository; * @since 2021-07-23 */ @Repository("fileUploadConfigDao") -public class FileUploadConfigDaoImpl extends ServiceImpl implements FileUploadConfigDao { +public class FileUploadConfigDaoImpl extends + ServiceImpl implements FileUploadConfigDao { + /** + * 通过渠道码和桶名称获取获取指定上传配置 + * + * @param bucketNo + * @param directory + * @return + */ + @Override + public FileUploadConfig getByUploadConfig(String bucketNo, String directory) { + return lambdaQuery().eq(FileUploadConfig::getAppChannelBucketNo, bucketNo) + .eq(FileUploadConfig::getDirectory, directory) + .eq(FileUploadConfig::getIsDelete, IsDeleteEnum.NO.getCode()).one(); + } } diff --git a/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java b/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java index ae5da6c..47a822e 100644 --- a/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java +++ b/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java @@ -23,5 +23,5 @@ public interface FileService { * * @param request */ - void update(ServerFileUploadDto request); + void upload(ServerFileUploadDto request); } diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java index 8396c57..62f1a42 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java @@ -2,18 +2,34 @@ package cn.axzo.oss.service.impl; import cn.axzo.oss.common.constans.CommonConstants.FileStatus; import cn.axzo.oss.common.constans.CommonConstants.TableDelete; +import cn.axzo.oss.common.enums.CodeEnum; +import cn.axzo.oss.common.exception.BizException; import cn.axzo.oss.common.utils.JsonUtil; import cn.axzo.oss.common.utils.Utility; +import cn.axzo.oss.dal.entity.AppChannelBucket; import cn.axzo.oss.dal.entity.File; +import cn.axzo.oss.dal.entity.FileApp; +import cn.axzo.oss.dal.entity.FileBusinessScene; +import cn.axzo.oss.dal.entity.FileChannel; +import cn.axzo.oss.dal.entity.FileUploadConfig; +import cn.axzo.oss.dal.repository.AppChannelBucketDao; +import cn.axzo.oss.dal.repository.FileAppDao; +import cn.axzo.oss.dal.repository.FileBusinessSceneDao; +import cn.axzo.oss.dal.repository.FileChannelDao; import cn.axzo.oss.dal.repository.FileDao; +import cn.axzo.oss.dal.repository.FileUploadConfigDao; import cn.axzo.oss.manager.api.FileManager; import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; import cn.axzo.oss.manager.api.dto.request.ServerFileUploadDto; import cn.axzo.oss.service.api.FileService; import com.alibaba.fastjson.JSON; +import com.google.common.collect.Lists; +import java.util.ArrayList; +import java.util.List; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.ObjectUtils; /** * @Author admin @@ -31,6 +47,17 @@ public class FileServiceImpl implements FileService { @Autowired private FileDao fileDao; + @Autowired + private FileAppDao fileAppDao; + @Autowired + private AppChannelBucketDao appChannelBucketDao; + @Autowired + private FileChannelDao fileChannelDao; + @Autowired + private FileBusinessSceneDao fileBusinessSceneDao; + @Autowired + private FileUploadConfigDao fileUploadConfigDao; + /** * 删除文件 * @@ -67,7 +94,7 @@ public class FileServiceImpl implements FileService { * @param dto */ @Override - public void update(ServerFileUploadDto dto) { + public void upload(ServerFileUploadDto dto) { log.info("update dto:{}", JSON.toJSONString(dto)); /** * 1.检查app @@ -77,5 +104,61 @@ public class FileServiceImpl implements FileService { * 5.检查文件大小,格式 * 6.上传至oss */ + FileApp fileAppByAppCode = fileAppDao.getByAppCode(dto.getAppCode()); + if (fileAppByAppCode == null) { + log.error("upload 未找到对应编码 appCode:{}", dto.getAppCode()); + throw new BizException(CodeEnum.APP_CODE_NOT_FOUND); + } + + List appChannelBuckets = appChannelBucketDao + .getByAppCode(dto.getAppCode()); + if (ObjectUtils.isEmpty(appChannelBuckets)) { + log.error("upload 文件渠道桶信息不存在 appCode:{}", dto.getAppCode()); + throw new BizException(CodeEnum.APP_CHANNEL_BUCKET_NOT_FOUND); + } + + // todo 判断权限 + + // 找到最优渠道 + ArrayList channels = Lists.newArrayList(); + appChannelBuckets.forEach(appChannelBucket -> channels.add(appChannelBucket.getChannelCode())); + + List fileChannels = fileChannelDao.getByChannelCode(channels); + if (ObjectUtils.isEmpty(fileChannels)) { + log.error("upload 最优渠道为空 channels:{}", channels); + throw new BizException(CodeEnum.APP_CHANNEL_NOT_FOUND); + } + + FileChannel fileChannel = fileChannels.get(0); + AppChannelBucket appChannelBucket = appChannelBuckets.stream().filter(bucket -> + bucket.getChannelCode().equals(fileChannel.getChannelCode())) + .findFirst().orElse(null); + + // 通过渠道桶编码获取到具体文件业务场景 + FileBusinessScene scene = fileBusinessSceneDao + .getByBucketNoAndScene(appChannelBucket.getAppChannelBucketNo(), dto.getBizScene()); + if (scene == null) { + log.error("upload 渠道不存在 appCode:{},bizScene:{}", dto.getAppCode(), dto.getBizScene()); + throw new BizException(CodeEnum.APP_CHANNEL_NOT_FOUND); + } + + FileUploadConfig fileUploadConfig = fileUploadConfigDao + .getByUploadConfig(scene.getAppChannelBucketNo(), scene.getDirectory()); + if (fileUploadConfig == null) { + log.error("upload 上传配置不存在 bucketNo:{},bucketName:{}", scene.getAppChannelBucketNo() + , scene.getBucketName()); + throw new BizException(CodeEnum.NO_UPLOAD_CONFIG); + } + + // 判断容量 + int size = Utility + .capacityConversion(fileUploadConfig.getStorageSize(), fileUploadConfig.getStorageUnit()); + if (dto.getFileContent().length > size) { + log.error("upload 文件大小超出上限 file size:{},storageSize:{}", dto.getFileContent().length + , size); + throw new BizException(CodeEnum.FILE_SIZE_EXCEEDS_LIMIT); + } + // todo 文件格式判断 + } } From d454a6380c3f09a4b320d2dcc742666c87bbd06e Mon Sep 17 00:00:00 2001 From: zhangran Date: Mon, 2 Aug 2021 17:54:23 +0800 Subject: [PATCH 11/31] =?UTF-8?q?add-=E5=AE=9E=E7=8E=B0=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E5=B9=B6=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ServerFileController.java | 3 +- oss-client/src/main/resources/bootstrap.yml | 6 +- .../cn/axzo/oss/common/enums/CodeEnum.java | 3 + .../axzo/oss/common/enums/FileStatusEnum.java | 35 +++++++++ .../cn/axzo/oss/common/utils/Utility.java | 9 +++ .../oss/integration/s3/AliOssService.java | 5 ++ .../integration/s3/base/BaseS3Service.java | 5 +- .../integration/s3/base/OssClientBase.java | 2 + .../integration/s3/client/AliOssClient.java | 5 ++ .../s3/impl/AliOssServiceImpl.java | 34 ++++++++- .../cn/axzo/oss/manager/api/FileManager.java | 17 +++++ .../response/ServerFileUploadResponse.java | 28 +++++++ .../oss/manager/impl/FileManagerImpl.java | 28 +++++++ .../cn/axzo/oss/service/api/FileService.java | 3 +- .../oss/service/impl/FileServiceImpl.java | 75 ++++++++++++++++++- .../cn/axzo/oss/test/FileServiceTest.java | 36 ++++++++- 16 files changed, 279 insertions(+), 15 deletions(-) create mode 100644 oss-common/src/main/java/cn/axzo/oss/common/enums/FileStatusEnum.java create mode 100644 oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/response/ServerFileUploadResponse.java diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java index 7e40698..af12048 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java @@ -31,8 +31,7 @@ public class ServerFileController implements ServerFileServiceApi { @Override public CommonResponse upload(@Valid @RequestBody ServerFileUploadRequest request) { ServerFileUploadDto dto = BeanConvertUtil.copyBean(request, ServerFileUploadDto.class); - fileService.upload(dto); - return null; + return CommonResponse.success(fileService.upload(dto)); } /** diff --git a/oss-client/src/main/resources/bootstrap.yml b/oss-client/src/main/resources/bootstrap.yml index 64596a6..4be26cd 100644 --- a/oss-client/src/main/resources/bootstrap.yml +++ b/oss-client/src/main/resources/bootstrap.yml @@ -4,12 +4,12 @@ spring: cloud: nacos: config: - server-addr: ${NACOS_HOST:dev-nacos.axzo.cn}:${NACOS_PORT:80} + server-addr: ${NACOS_HOST:127.0.0.1}:${NACOS_PORT:8848} file-extension: yaml - namespace: ${NACOS_NAMESPACE_ID:f82179f1-81a9-41a1-a489-4f9ab5660a6e} + namespace: ${NACOS_NAMESPACE_ID:8921646d-ff54-4fd4-a258-2f80ce21142d} prefix: ${spring.application.name} profiles: - active: ${NACOS_PROFILES_ACTIVE:local} + active: ${NACOS_PROFILES_ACTIVE:dev} main: allow-bean-definition-overriding: true diff --git a/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java b/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java index b129aa2..e8323bc 100644 --- a/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java +++ b/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java @@ -37,6 +37,9 @@ public enum CodeEnum implements EnumBase { NO_CHANNELS_AVAILABLE(105,"no channels available"), NO_UPLOAD_CONFIG(106,"no upload config"), FILE_SIZE_EXCEEDS_LIMIT(107,"file size exceeds limit"), + NOT_FILE_FORMAT(108,"failed to get file format"), + FILE_FORMAT_NOT_SUPPORTED(109,"file format is not supported"), + FILE_UPLOAD_FAILED(109,"file upload failed"), ; diff --git a/oss-common/src/main/java/cn/axzo/oss/common/enums/FileStatusEnum.java b/oss-common/src/main/java/cn/axzo/oss/common/enums/FileStatusEnum.java new file mode 100644 index 0000000..fcf005d --- /dev/null +++ b/oss-common/src/main/java/cn/axzo/oss/common/enums/FileStatusEnum.java @@ -0,0 +1,35 @@ +package cn.axzo.oss.common.enums; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * @author: zhangran + * @date: 20210802 14:48 + * @description: + **/ +@Getter +@RequiredArgsConstructor +public enum FileStatusEnum implements EnumBase { + /** + * 处理中 + */ + STATUS_PROCESSING(0, "处理中"), + /** + * 上传成功 + */ + STATUS_UPLOAD_SUCCESS(1, "上传成功"), + /** + * 上传失败 + */ + STATUS_UPLOAD_FAIL(2, "上传失败"), + /** + * 已删除 + */ + STATUS_DELETE(3, "已删除"), + ; + + private final Integer code; + + private final String message; +} diff --git a/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java b/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java index 0253a39..ea650ea 100644 --- a/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java +++ b/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java @@ -5,6 +5,7 @@ import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Objects; +import java.util.UUID; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.binary.Hex; @@ -102,4 +103,12 @@ public class Utility { } return storageUnitEnum.getSize() * size; } + + /** + * 生成UUID + * @return + */ + public static String getUUID(){ + return UUID.randomUUID().toString().replaceAll("-",""); + } } diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/AliOssService.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/AliOssService.java index 8808762..836251d 100644 --- a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/AliOssService.java +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/AliOssService.java @@ -10,4 +10,9 @@ import cn.axzo.oss.integration.s3.base.BaseS3Service; **/ public interface AliOssService extends BaseS3Service { + /** + * get endpoint + * @return + */ + String getEndpoint(); } diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/base/BaseS3Service.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/base/BaseS3Service.java index 7ed1484..06639bf 100644 --- a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/base/BaseS3Service.java +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/base/BaseS3Service.java @@ -20,8 +20,7 @@ public interface BaseS3Service { /** * upload file */ - boolean uploadByStream(InputStream srcStream, String tgtFileKey); - + String uploadByStream(String bucketName, String tgtFileKey, InputStream srcStream); /** * upload multi file @@ -51,4 +50,6 @@ public interface BaseS3Service { */ FilterInputStream getS3ObjectStream(String tgtFileKey); + + } diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/base/OssClientBase.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/base/OssClientBase.java index a1e11ee..97b9020 100644 --- a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/base/OssClientBase.java +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/base/OssClientBase.java @@ -12,4 +12,6 @@ public interface OssClientBase { void initClient(); + String getEndpoint(); + } diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/client/AliOssClient.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/client/AliOssClient.java index 92e8944..ce5911a 100644 --- a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/client/AliOssClient.java +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/client/AliOssClient.java @@ -47,4 +47,9 @@ public class AliOssClient implements OssClientBase { } } + @Override + public String getEndpoint(){ + return aliOssConfig.getEndpoint(); + } + } diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/AliOssServiceImpl.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/AliOssServiceImpl.java index 80d5c38..bf5d69a 100644 --- a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/AliOssServiceImpl.java +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/AliOssServiceImpl.java @@ -1,8 +1,11 @@ package cn.axzo.oss.integration.s3.impl; +import cn.axzo.oss.common.enums.CodeEnum; +import cn.axzo.oss.common.exception.BizException; import cn.axzo.oss.integration.s3.AliOssService; import cn.axzo.oss.integration.s3.client.AliOssClient; import com.aliyun.oss.ClientException; +import com.aliyun.oss.OSS; import com.aliyun.oss.OSSException; import java.io.FilterInputStream; import java.io.InputStream; @@ -29,8 +32,28 @@ public class AliOssServiceImpl implements AliOssService { * upload file */ @Override - public boolean uploadByStream(InputStream srcStream, String tgtFileKey) { - return false; + public String uploadByStream(String bucketName, String tgtFileKey, InputStream srcStream) { + OSS client = aliOssClient.getClient(); + try { + client.putObject(bucketName, tgtFileKey, srcStream); + } catch (OSSException e) { + log.error("uploadByStream OSSException", e); + return ""; + } catch (ClientException e) { + log.error("uploadByStream ClientException", e); + return ""; + } finally { + client.shutdown(); + } + + StringBuilder allBuilder = new StringBuilder(); + allBuilder.append("https://"); + allBuilder.append(bucketName); + allBuilder.append("."); + allBuilder.append(aliOssClient.getEndpoint()); + allBuilder.append(tgtFileKey); + + return allBuilder.toString(); } /** @@ -51,7 +74,7 @@ public class AliOssServiceImpl implements AliOssService { aliOssClient.getClient().deleteObject(bucket, tgtFileKey); return Boolean.TRUE; } catch (Exception e) { - log.error("ali oss delFile error = {}",e); + log.error("ali oss delFile error = {}", e); } return Boolean.FALSE; } @@ -81,4 +104,9 @@ public class AliOssServiceImpl implements AliOssService { public FilterInputStream getS3ObjectStream(String tgtFileKey) { return null; } + + @Override + public String getEndpoint() { + return aliOssClient.getEndpoint(); + } } diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java index e005638..11d699e 100644 --- a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java @@ -11,4 +11,21 @@ import cn.axzo.oss.dal.entity.File; public interface FileManager { boolean delete(File file); + + /** + * 上传 + * + * @param bulkName + * @param keyPath + * @param fileContent + * @return + */ + String uploadByStream(String bulkName, String keyPath, byte[] fileContent); + + /** + * get endpoint + * + * @return + */ + String getAliOssEndpoint(); } diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/response/ServerFileUploadResponse.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/response/ServerFileUploadResponse.java new file mode 100644 index 0000000..3f981ae --- /dev/null +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/response/ServerFileUploadResponse.java @@ -0,0 +1,28 @@ +package cn.axzo.oss.manager.api.dto.response; + +import lombok.Data; + +/** + * 服务端文件上传响应类 + * + * @author zhaoyong + * @see ServerFileUploadResponse + * @since 2021-07-23 10:37 + */ +@Data +public class ServerFileUploadResponse { + + /** + * 文件 URL + */ + private String url; + /** + * 文件 Key + */ + private String fileKey; + /** + * URL MD5 + */ + private String urlMd5; + +} diff --git a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java index af0023e..afc4f55 100644 --- a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java +++ b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java @@ -2,8 +2,16 @@ package cn.axzo.oss.manager.impl; import cn.axzo.oss.dal.entity.File; import cn.axzo.oss.integration.s3.AliOssService; +import cn.axzo.oss.integration.s3.config.AliOssConfig; import cn.axzo.oss.manager.api.FileManager; +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClientBuilder; +import java.io.ByteArrayInputStream; +import java.io.FileInputStream; +import java.io.InputStream; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.util.Strings; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -24,4 +32,24 @@ public class FileManagerImpl implements FileManager { public boolean delete(File file) { return aliOssService.delFile(file.getBucketName(), file.getFileUuid()); } + + /** + * @param bulkName 默认的取值为 + * @param keyPath key的前置路径 + */ + public String uploadByStream(String bulkName, String keyPath, byte[] fileContent) { + + InputStream inputStream = new ByteArrayInputStream(fileContent); + + return aliOssService.uploadByStream(bulkName, keyPath, inputStream); + } + + /** + * get endpoint + * + * @return + */ + public String getAliOssEndpoint() { + return aliOssService.getEndpoint(); + } } diff --git a/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java b/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java index 47a822e..fafed85 100644 --- a/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java +++ b/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java @@ -2,6 +2,7 @@ package cn.axzo.oss.service.api; import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; import cn.axzo.oss.manager.api.dto.request.ServerFileUploadDto; +import cn.axzo.oss.manager.api.dto.response.ServerFileUploadResponse; /** * @Author admin @@ -23,5 +24,5 @@ public interface FileService { * * @param request */ - void upload(ServerFileUploadDto request); + ServerFileUploadResponse upload(ServerFileUploadDto request); } diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java index 62f1a42..7aafd7d 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java @@ -3,6 +3,7 @@ package cn.axzo.oss.service.impl; import cn.axzo.oss.common.constans.CommonConstants.FileStatus; import cn.axzo.oss.common.constans.CommonConstants.TableDelete; import cn.axzo.oss.common.enums.CodeEnum; +import cn.axzo.oss.common.enums.FileStatusEnum; import cn.axzo.oss.common.exception.BizException; import cn.axzo.oss.common.utils.JsonUtil; import cn.axzo.oss.common.utils.Utility; @@ -22,9 +23,11 @@ import cn.axzo.oss.manager.api.FileManager; import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; import cn.axzo.oss.manager.api.dto.request.ServerFileUploadDto; import cn.axzo.oss.service.api.FileService; +import cn.axzo.oss.manager.api.dto.response.ServerFileUploadResponse; import com.alibaba.fastjson.JSON; import com.google.common.collect.Lists; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -58,6 +61,7 @@ public class FileServiceImpl implements FileService { @Autowired private FileUploadConfigDao fileUploadConfigDao; + /** * 删除文件 * @@ -94,8 +98,9 @@ public class FileServiceImpl implements FileService { * @param dto */ @Override - public void upload(ServerFileUploadDto dto) { - log.info("update dto:{}", JSON.toJSONString(dto)); + public ServerFileUploadResponse upload(ServerFileUploadDto dto) { + log.info("update fileName:{},appCode:{},bizScene:{}", + dto.getFileName(), dto.getAppCode(), dto.getBizScene()); /** * 1.检查app * 2.渠道 @@ -133,6 +138,10 @@ public class FileServiceImpl implements FileService { AppChannelBucket appChannelBucket = appChannelBuckets.stream().filter(bucket -> bucket.getChannelCode().equals(fileChannel.getChannelCode())) .findFirst().orElse(null); + if (appChannelBucket == null) { + log.error("upload 最优渠道为空 channels:{}", channels); + throw new BizException(CodeEnum.APP_CHANNEL_NOT_FOUND); + } // 通过渠道桶编码获取到具体文件业务场景 FileBusinessScene scene = fileBusinessSceneDao @@ -158,7 +167,67 @@ public class FileServiceImpl implements FileService { , size); throw new BizException(CodeEnum.FILE_SIZE_EXCEEDS_LIMIT); } - // todo 文件格式判断 + // 文件格式判断 + String[] formats = fileUploadConfig.getFileFormat().split(","); + int lastIndexOf = dto.getFileName().lastIndexOf("."); + if (lastIndexOf == -1) { + log.error("获取文件格式失败:{}", dto.getFileName()); + throw new BizException(CodeEnum.NOT_FILE_FORMAT); + } + + String fileFormats = dto.getFileName().substring(lastIndexOf + 1).toLowerCase(); + boolean contains = Arrays.asList(formats).contains(fileFormats); + if (!contains) { + log.error("不支持此格式文件fileName:{},formats:{}", dto.getFileName(), formats); + throw new BizException(CodeEnum.FILE_FORMAT_NOT_SUPPORTED); + } + String md5 = Utility.getMd5(dto.getFileContent()); + + File ossFile = new File(); + ossFile.setAppChannelBucketNo(fileUploadConfig.getAppChannelBucketNo()); + ossFile.setAppCode(fileUploadConfig.getAppCode()); + ossFile.setChannelCode(fileUploadConfig.getChannelCode()); + ossFile.setBucketName(fileUploadConfig.getBucketName()); + ossFile.setDirectory(fileUploadConfig.getDirectory()); + ossFile.setFileMd5(md5); + ossFile.setStatus(FileStatusEnum.STATUS_PROCESSING.getCode()); + ossFile.setFileFormat(fileFormats); + ossFile.setFileName(dto.getFileName()); + ossFile.setStorageUnit(fileUploadConfig.getStorageUnit()); + ossFile.setStorageSize(fileUploadConfig.getStorageSize()); + + String uuid = Utility.getUUID(); + + // 上传文件 + StringBuilder builder = new StringBuilder(); + builder.append(fileUploadConfig.getDirectory()); + builder.append("/"); + builder.append(uuid); + builder.append("."); + builder.append(fileFormats); + + String fileUrl = fileManager.uploadByStream( + fileUploadConfig.getBucketName(), builder.toString(), dto.getFileContent()); + if (Utility.isBlank(fileUrl)) { + ossFile.setStatus(FileStatusEnum.STATUS_UPLOAD_FAIL.getCode()); + fileDao.save(ossFile); + throw new BizException(CodeEnum.FILE_UPLOAD_FAILED); + } + + ossFile.setFileUuid(uuid); + ossFile.setFileUrl(fileUrl); + ossFile.setUrlMd5(Utility.getMd5(fileUrl)); + ossFile.setStatus(FileStatusEnum.STATUS_UPLOAD_SUCCESS.getCode()); + fileDao.save(ossFile); + + ServerFileUploadResponse response = new ServerFileUploadResponse(); + response.setUrl(ossFile.getFileUrl()); + response.setUrlMd5(ossFile.getUrlMd5()); + response.setFileKey(ossFile.getFileUuid()); + + return response; } + + } diff --git a/oss-test/src/test/java/cn/axzo/oss/test/FileServiceTest.java b/oss-test/src/test/java/cn/axzo/oss/test/FileServiceTest.java index d1d4395..b48909d 100644 --- a/oss-test/src/test/java/cn/axzo/oss/test/FileServiceTest.java +++ b/oss-test/src/test/java/cn/axzo/oss/test/FileServiceTest.java @@ -1,8 +1,15 @@ package cn.axzo.oss.test; import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; +import cn.axzo.oss.manager.api.dto.request.ServerFileUploadDto; import cn.axzo.oss.service.api.FileService; import cn.axzo.oss.test.base.SpringTestBase; +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.ArrayList; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -18,11 +25,38 @@ public class FileServiceTest extends SpringTestBase { private FileService fileService; @Test - public void deleteTest(){ + public void deleteTest() { ServerFileDeleteDto dto = new ServerFileDeleteDto(); dto.setUrl("https://axzo-pro.oss-cn-hangzhou.aliyuncs.com/stable/face/19700101080046_6296.jpg"); dto.setOperator("zhangsan"); fileService.delete(dto); } + + @Test + public void upload() { + ServerFileUploadDto dto = new ServerFileUploadDto(); + dto.setAppCode("test"); + dto.setBizScene("1"); + dto.setFileName("一个新的文件.jpg"); + + File file = new File("/Users/zhangran/Desktop/xx/IMG_20210728_162815.jpg"); + + FileInputStream fileInputStream = null; + + byte[] bytes = new byte[(int) file.length()]; + try { + fileInputStream = new FileInputStream(file); + fileInputStream.read(bytes); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + dto.setFileContent(bytes); + + fileService.upload(dto); + } + + } From 4cf3dcdb4bd822a33d716915791d59939ab03e99 Mon Sep 17 00:00:00 2001 From: zhangran Date: Mon, 2 Aug 2021 18:44:10 +0800 Subject: [PATCH 12/31] =?UTF-8?q?fix-=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/oss/integration/s3/AliOssService.java | 5 ----- .../cn/axzo/oss/integration/s3/impl/AliOssServiceImpl.java | 7 ------- 2 files changed, 12 deletions(-) diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/AliOssService.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/AliOssService.java index 836251d..8808762 100644 --- a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/AliOssService.java +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/AliOssService.java @@ -10,9 +10,4 @@ import cn.axzo.oss.integration.s3.base.BaseS3Service; **/ public interface AliOssService extends BaseS3Service { - /** - * get endpoint - * @return - */ - String getEndpoint(); } diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/AliOssServiceImpl.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/AliOssServiceImpl.java index bf5d69a..fa34d14 100644 --- a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/AliOssServiceImpl.java +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/AliOssServiceImpl.java @@ -1,7 +1,5 @@ package cn.axzo.oss.integration.s3.impl; -import cn.axzo.oss.common.enums.CodeEnum; -import cn.axzo.oss.common.exception.BizException; import cn.axzo.oss.integration.s3.AliOssService; import cn.axzo.oss.integration.s3.client.AliOssClient; import com.aliyun.oss.ClientException; @@ -104,9 +102,4 @@ public class AliOssServiceImpl implements AliOssService { public FilterInputStream getS3ObjectStream(String tgtFileKey) { return null; } - - @Override - public String getEndpoint() { - return aliOssClient.getEndpoint(); - } } From 674a635fd3343b9e762f55caa6aa9050220beca1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9C=E8=A2=81=E6=9D=B0=E2=80=9D?= <“yuanjie@zhiyoutec.com”> Date: Mon, 2 Aug 2021 18:45:04 +0800 Subject: [PATCH 13/31] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/oss/manager/impl/FileManagerImpl.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java index afc4f55..b0dd165 100644 --- a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java +++ b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java @@ -2,16 +2,10 @@ package cn.axzo.oss.manager.impl; import cn.axzo.oss.dal.entity.File; import cn.axzo.oss.integration.s3.AliOssService; -import cn.axzo.oss.integration.s3.config.AliOssConfig; import cn.axzo.oss.manager.api.FileManager; -import com.aliyun.oss.OSS; -import com.aliyun.oss.OSSClientBuilder; import java.io.ByteArrayInputStream; -import java.io.FileInputStream; import java.io.InputStream; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.apache.logging.log4j.util.Strings; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -30,7 +24,8 @@ public class FileManagerImpl implements FileManager { @Override public boolean delete(File file) { - return aliOssService.delFile(file.getBucketName(), file.getFileUuid()); + String tgtFileKey = file.getDirectory() + "/" + file.getFileUuid() + "." + file.getFileFormat(); + return aliOssService.delFile(file.getBucketName(), tgtFileKey); } /** From 1201876ea31d13aa216d6326b8050cfe0b646621 Mon Sep 17 00:00:00 2001 From: zhangran Date: Mon, 2 Aug 2021 18:46:26 +0800 Subject: [PATCH 14/31] =?UTF-8?q?fix-=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/axzo/oss/manager/api/FileManager.java | 6 ------ .../java/cn/axzo/oss/manager/impl/FileManagerImpl.java | 8 -------- 2 files changed, 14 deletions(-) diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java index 11d699e..27a342f 100644 --- a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java @@ -22,10 +22,4 @@ public interface FileManager { */ String uploadByStream(String bulkName, String keyPath, byte[] fileContent); - /** - * get endpoint - * - * @return - */ - String getAliOssEndpoint(); } diff --git a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java index afc4f55..115e307 100644 --- a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java +++ b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java @@ -44,12 +44,4 @@ public class FileManagerImpl implements FileManager { return aliOssService.uploadByStream(bulkName, keyPath, inputStream); } - /** - * get endpoint - * - * @return - */ - public String getAliOssEndpoint() { - return aliOssService.getEndpoint(); - } } From 52024069c3e95e2555d3d59dc58ec3fffeda0020 Mon Sep 17 00:00:00 2001 From: zhangran Date: Mon, 2 Aug 2021 18:54:07 +0800 Subject: [PATCH 15/31] =?UTF-8?q?fix-=E4=BF=AE=E6=94=B9nacos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oss-client/src/main/resources/bootstrap.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/oss-client/src/main/resources/bootstrap.yml b/oss-client/src/main/resources/bootstrap.yml index 4be26cd..64596a6 100644 --- a/oss-client/src/main/resources/bootstrap.yml +++ b/oss-client/src/main/resources/bootstrap.yml @@ -4,12 +4,12 @@ spring: cloud: nacos: config: - server-addr: ${NACOS_HOST:127.0.0.1}:${NACOS_PORT:8848} + server-addr: ${NACOS_HOST:dev-nacos.axzo.cn}:${NACOS_PORT:80} file-extension: yaml - namespace: ${NACOS_NAMESPACE_ID:8921646d-ff54-4fd4-a258-2f80ce21142d} + namespace: ${NACOS_NAMESPACE_ID:f82179f1-81a9-41a1-a489-4f9ab5660a6e} prefix: ${spring.application.name} profiles: - active: ${NACOS_PROFILES_ACTIVE:dev} + active: ${NACOS_PROFILES_ACTIVE:local} main: allow-bean-definition-overriding: true From 89910f77969a8263e940d5e5d1f6872165160848 Mon Sep 17 00:00:00 2001 From: zhangran Date: Mon, 2 Aug 2021 18:59:08 +0800 Subject: [PATCH 16/31] fix- --- .../java/cn/axzo/oss/service/impl/FileServiceImpl.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java index 7aafd7d..fea835a 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java @@ -101,14 +101,7 @@ public class FileServiceImpl implements FileService { public ServerFileUploadResponse upload(ServerFileUploadDto dto) { log.info("update fileName:{},appCode:{},bizScene:{}", dto.getFileName(), dto.getAppCode(), dto.getBizScene()); - /** - * 1.检查app - * 2.渠道 - * 3.渠道对应桶信息 - * 4.获取应用场景目录 - * 5.检查文件大小,格式 - * 6.上传至oss - */ + FileApp fileAppByAppCode = fileAppDao.getByAppCode(dto.getAppCode()); if (fileAppByAppCode == null) { log.error("upload 未找到对应编码 appCode:{}", dto.getAppCode()); From 2aadb8e3dc373e0f3db65efe5e55a4afce2a7ff3 Mon Sep 17 00:00:00 2001 From: zhaoyong Date: Wed, 28 Jul 2021 10:18:57 +0800 Subject: [PATCH 17/31] Mybatis Mapper --- oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java | 1 + .../java/cn/axzo/oss/http/api/ServerFileServiceApi.java | 6 ++---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java b/oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java index 23ebc7e..9c62c48 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java @@ -13,6 +13,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; * @since 2021-07-15 11:34 */ @Slf4j +@MapperScan(basePackages = {"cn.axzo.oss.dal.mapper"}) @SpringBootApplication(scanBasePackages = {"cn.axzo.oss"}) @MapperScan(basePackages = {"cn.axzo.oss.dal.mapper"}) public class Bootstrap { diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/api/ServerFileServiceApi.java b/oss-http-api/src/main/java/cn/axzo/oss/http/api/ServerFileServiceApi.java index b1e6691..133b504 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/api/ServerFileServiceApi.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/api/ServerFileServiceApi.java @@ -5,8 +5,6 @@ import cn.axzo.oss.http.model.ServerFileUploadRequest; import cn.axzo.oss.http.model.ServerFileUploadResponse; import cn.azxo.framework.common.model.CommonResponse; import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -29,7 +27,7 @@ public interface ServerFileServiceApi { * @param request * @return */ - @PutMapping(value = "/upload") + @RequestMapping(value = "/upload", method = RequestMethod.POST) CommonResponse upload(ServerFileUploadRequest request); /** @@ -37,7 +35,7 @@ public interface ServerFileServiceApi { * @param request * @return */ - @DeleteMapping(value = "/delete") + @RequestMapping(value = "/delete", method = RequestMethod.POST) CommonResponse delete(ServerFileDeleteRequest request); } From 572d09a4ab2adc279c7db928c0b34a3912444f08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9C=E8=A2=81=E6=9D=B0=E2=80=9D?= <“yuanjie@zhiyoutec.com”> Date: Mon, 2 Aug 2021 18:54:50 +0800 Subject: [PATCH 18/31] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oss-test/src/test/java/cn/axzo/oss/test/FileServiceTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oss-test/src/test/java/cn/axzo/oss/test/FileServiceTest.java b/oss-test/src/test/java/cn/axzo/oss/test/FileServiceTest.java index b48909d..b51677a 100644 --- a/oss-test/src/test/java/cn/axzo/oss/test/FileServiceTest.java +++ b/oss-test/src/test/java/cn/axzo/oss/test/FileServiceTest.java @@ -27,7 +27,7 @@ public class FileServiceTest extends SpringTestBase { @Test public void deleteTest() { ServerFileDeleteDto dto = new ServerFileDeleteDto(); - dto.setUrl("https://axzo-pro.oss-cn-hangzhou.aliyuncs.com/stable/face/19700101080046_6296.jpg"); + dto.setUrl("https://axzo-public.oss-cn-chengdu.aliyuncs.com/109/108046507ad94bf084aa86c07d743799.jpg"); dto.setOperator("zhangsan"); fileService.delete(dto); } From 8560b6f923e96b463365aa5c9321e6bc0d69a7b5 Mon Sep 17 00:00:00 2001 From: zhaoyong Date: Tue, 3 Aug 2021 15:16:48 +0800 Subject: [PATCH 19/31] =?UTF-8?q?=E7=89=88=E6=9C=AC=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oss-client/pom.xml | 8 ++++++++ oss-common/pom.xml | 2 +- .../cn/axzo/oss/http/model/ServerFileDeleteRequest.java | 3 +++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/oss-client/pom.xml b/oss-client/pom.xml index ee16508..cfee4f0 100644 --- a/oss-client/pom.xml +++ b/oss-client/pom.xml @@ -106,6 +106,14 @@ 1.8 + + org.apache.maven.plugins + maven-deploy-plugin + 2.8.2 + + true + + diff --git a/oss-common/pom.xml b/oss-common/pom.xml index 8d70337..9d994ed 100644 --- a/oss-common/pom.xml +++ b/oss-common/pom.xml @@ -5,7 +5,7 @@ cn.axzo.oss oss - 1.0.0 + ${revision} oss-common diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileDeleteRequest.java b/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileDeleteRequest.java index 7bc9314..d621a4b 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileDeleteRequest.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileDeleteRequest.java @@ -14,6 +14,9 @@ import javax.validation.constraints.NotBlank; @Data public class ServerFileDeleteRequest { + @NotBlank(message = "appCode must not be null") + private String appCode; + @NotBlank(message = "url must not be null") private String url; From 250ea164558585b1424872552e0b08237cda6fe5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9C=E8=A2=81=E6=9D=B0=E2=80=9D?= <“yuanjie@zhiyoutec.com”> Date: Tue, 3 Aug 2021 15:20:19 +0800 Subject: [PATCH 20/31] =?UTF-8?q?fix:=E5=A2=9E=E5=8A=A0=E5=85=AC=E5=85=B1?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E5=8F=8A=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=A3=80=E6=9F=A5appcode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oss/common/constans/CommonConstants.java | 10 +++++++ .../cn/axzo/oss/common/utils/Utility.java | 15 ++++++++++ .../axzo/oss/dal/repository/FileAppDao.java | 1 - .../cn/axzo/oss/manager/api/FileManager.java | 4 +-- .../api/dto/request/ServerFileDeleteDto.java | 11 +++++++ .../oss/manager/impl/FileManagerImpl.java | 6 ++-- .../oss/service/impl/FileServiceImpl.java | 29 ++++++++++++++----- 7 files changed, 61 insertions(+), 15 deletions(-) diff --git a/oss-common/src/main/java/cn/axzo/oss/common/constans/CommonConstants.java b/oss-common/src/main/java/cn/axzo/oss/common/constans/CommonConstants.java index ffa8981..7fbee93 100644 --- a/oss-common/src/main/java/cn/axzo/oss/common/constans/CommonConstants.java +++ b/oss-common/src/main/java/cn/axzo/oss/common/constans/CommonConstants.java @@ -9,6 +9,16 @@ package cn.axzo.oss.common.constans; */ public abstract class CommonConstants { + /** + * 默认 分割器 + */ + public static final String SEPARATOR_CHAR = "/"; + + /** + * 默认 . + */ + public static final String DOT = "."; + /** * 是否删除 */ diff --git a/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java b/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java index ea650ea..0ac709a 100644 --- a/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java +++ b/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java @@ -1,6 +1,8 @@ package cn.axzo.oss.common.utils; +import cn.axzo.oss.common.constans.CommonConstants; import cn.axzo.oss.common.enums.StorageUnitEnum; +import java.io.File; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; @@ -111,4 +113,17 @@ public class Utility { public static String getUUID(){ return UUID.randomUUID().toString().replaceAll("-",""); } + + /** + * 生成file key + * @return + */ + public static String generateFileKey(String directory, String fileUuid, String fileFormat){ + StringBuilder tgtFileKey = new StringBuilder(directory); + tgtFileKey.append(CommonConstants.SEPARATOR_CHAR); + tgtFileKey.append(fileUuid); + tgtFileKey.append(CommonConstants.DOT); + tgtFileKey.append(fileFormat); + return tgtFileKey.toString(); + } } diff --git a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileAppDao.java b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileAppDao.java index 517210f..7966b48 100644 --- a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileAppDao.java +++ b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileAppDao.java @@ -1,6 +1,5 @@ package cn.axzo.oss.dal.repository; -import cn.axzo.oss.dal.entity.File; import cn.axzo.oss.dal.entity.FileApp; import com.baomidou.mybatisplus.extension.service.IService; diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java index 27a342f..ff25cba 100644 --- a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java @@ -1,7 +1,5 @@ package cn.axzo.oss.manager.api; -import cn.axzo.oss.dal.entity.File; - /** * @Author admin * @Description @@ -10,7 +8,7 @@ import cn.axzo.oss.dal.entity.File; **/ public interface FileManager { - boolean delete(File file); + boolean delete(String bucketName, String tgtFileKey); /** * 上传 diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileDeleteDto.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileDeleteDto.java index 87ac31e..1bc1ed7 100644 --- a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileDeleteDto.java +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileDeleteDto.java @@ -10,6 +10,17 @@ import lombok.Data; **/ @Data public class ServerFileDeleteDto { + + /** + * 应用码 + */ + private String appCode; + /** + * 文件地址 + */ private String url; + /** + * 操作人 + */ private String operator; } diff --git a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java index e90fcf6..1c559dd 100644 --- a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java +++ b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java @@ -1,6 +1,5 @@ package cn.axzo.oss.manager.impl; -import cn.axzo.oss.dal.entity.File; import cn.axzo.oss.integration.s3.AliOssService; import cn.axzo.oss.manager.api.FileManager; import java.io.ByteArrayInputStream; @@ -23,9 +22,8 @@ public class FileManagerImpl implements FileManager { private AliOssService aliOssService; @Override - public boolean delete(File file) { - String tgtFileKey = file.getDirectory() + "/" + file.getFileUuid() + "." + file.getFileFormat(); - return aliOssService.delFile(file.getBucketName(), tgtFileKey); + public boolean delete(String bucketName, String tgtFileKey) { + return aliOssService.delFile(bucketName, tgtFileKey); } /** diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java index fea835a..dde2082 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java @@ -22,9 +22,8 @@ import cn.axzo.oss.dal.repository.FileUploadConfigDao; import cn.axzo.oss.manager.api.FileManager; import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; import cn.axzo.oss.manager.api.dto.request.ServerFileUploadDto; -import cn.axzo.oss.service.api.FileService; import cn.axzo.oss.manager.api.dto.response.ServerFileUploadResponse; -import com.alibaba.fastjson.JSON; +import cn.axzo.oss.service.api.FileService; import com.google.common.collect.Lists; import java.util.ArrayList; import java.util.Arrays; @@ -70,6 +69,8 @@ public class FileServiceImpl implements FileService { @Override public void delete(ServerFileDeleteDto dto) { log.info("delete dto = {}", JsonUtil.obj2Str(dto)); + checkAppCode(dto.getAppCode()); + if (Utility.isBlank(dto.getUrl())) { log.warn("delete url is null"); return; @@ -81,17 +82,31 @@ public class FileServiceImpl implements FileService { log.warn("delete file is null,url = {}, urlMd5 = {}", dto.getUrl(), urlMd5); return; } - boolean deleteFlag = fileManager.delete(file); + String tgtFileKey = Utility.generateFileKey(file.getDirectory(), file.getFileUuid(), file.getFileFormat()); + log.debug("delete tgtFileKey = {}", tgtFileKey); + boolean deleteFlag = fileManager.delete(file.getBucketName(), tgtFileKey); log.info("delete deleteFlag = {}", deleteFlag); if (deleteFlag) { - file.setIsDelete(TableDelete.DELETE); - file.setStatus(FileStatus.DELETED); - file.setUpdateBy(dto.getOperator()); - file.setUpdateAt(null); + File updateFile = new File(); + updateFile.setIsDelete(TableDelete.DELETE); + updateFile.setStatus(FileStatus.DELETED); + updateFile.setUpdateBy(dto.getOperator()); + updateFile.setId(file.getId()); fileDao.updateById(file); } } + + /** + * 检查appCode是否有效 + * @param appCode + */ + private void checkAppCode(final String appCode){ + log.info("checkAppCode appCode = {}", appCode); + FileApp fileApp = fileAppDao.getByAppCode(appCode); + BizException.error(Utility.objIsNull(fileApp), CodeEnum.APP_CODE_NOT_FOUND); + } + /** * 上传 * From 2b3b6f85bd689d17d71831f86cb8a0f5c8112018 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9C=E8=A2=81=E6=9D=B0=E2=80=9D?= <“yuanjie@zhiyoutec.com”> Date: Tue, 3 Aug 2021 15:34:43 +0800 Subject: [PATCH 21/31] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oss/common/constans/CommonConstants.java | 11 +++++-- .../cn/axzo/oss/dal/repository/FileDao.java | 3 +- .../oss/dal/repository/impl/FileDaoImpl.java | 5 +-- .../http/model/ServerFileDeleteRequest.java | 3 ++ .../cn/axzo/oss/manager/api/FileManager.java | 6 ++++ .../oss/manager/impl/FileManagerImpl.java | 6 ++++ .../oss/service/impl/FileServiceImpl.java | 32 +++++++------------ 7 files changed, 40 insertions(+), 26 deletions(-) diff --git a/oss-common/src/main/java/cn/axzo/oss/common/constans/CommonConstants.java b/oss-common/src/main/java/cn/axzo/oss/common/constans/CommonConstants.java index 7fbee93..50cf6a3 100644 --- a/oss-common/src/main/java/cn/axzo/oss/common/constans/CommonConstants.java +++ b/oss-common/src/main/java/cn/axzo/oss/common/constans/CommonConstants.java @@ -23,8 +23,15 @@ public abstract class CommonConstants { * 是否删除 */ public interface TableDelete { - Integer UN_DELETE = 0; - Integer DELETE = 1; + + /** + * 未删除 + */ + Integer UN_DELETED = 0; + /** + * 已删除 + */ + Integer DELETED = 1; } /** diff --git a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileDao.java b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileDao.java index e009589..64f0f7b 100644 --- a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileDao.java +++ b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileDao.java @@ -15,8 +15,9 @@ public interface FileDao extends IService { /** * 根据url md5获取文件信息 + * @param appCode * @param urlMd5 * @return */ - File getFileByUrlMd5(String urlMd5); + File getByAppCodeAndUrlMd5(String appCode, String urlMd5); } diff --git a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileDaoImpl.java b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileDaoImpl.java index a18eac5..c6da68c 100644 --- a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileDaoImpl.java +++ b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileDaoImpl.java @@ -20,8 +20,9 @@ import org.springframework.stereotype.Repository; public class FileDaoImpl extends ServiceImpl implements FileDao { @Override - public File getFileByUrlMd5(String urlMd5) { - return lambdaQuery().eq(File::getUrlMd5, urlMd5).eq(File::getStatus, FileStatus.SUCCESS).eq(File::getIsDelete, TableDelete.UN_DELETE) + public File getByAppCodeAndUrlMd5(String appCode, String urlMd5) { + return lambdaQuery().eq(File::getAppCode, appCode).eq(File::getUrlMd5, urlMd5) + .eq(File::getStatus, FileStatus.SUCCESS).eq(File::getIsDelete, TableDelete.UN_DELETED) .last("limit 1").one(); } } diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileDeleteRequest.java b/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileDeleteRequest.java index d621a4b..d789bcf 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileDeleteRequest.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileDeleteRequest.java @@ -20,4 +20,7 @@ public class ServerFileDeleteRequest { @NotBlank(message = "url must not be null") private String url; + @NotBlank(message = "operator must not be null") + private String operator; + } diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java index ff25cba..b5355ea 100644 --- a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java @@ -8,6 +8,12 @@ package cn.axzo.oss.manager.api; **/ public interface FileManager { + /** + * 删除文件 + * @param bucketName 桶名称 + * @param tgtFileKey 目标文件key + * @return + */ boolean delete(String bucketName, String tgtFileKey); /** diff --git a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java index 1c559dd..45bf80b 100644 --- a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java +++ b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java @@ -21,6 +21,12 @@ public class FileManagerImpl implements FileManager { @Autowired private AliOssService aliOssService; + /** + * 删除文件 + * @param bucketName 桶名称 + * @param tgtFileKey 目标文件key + * @return + */ @Override public boolean delete(String bucketName, String tgtFileKey) { return aliOssService.delFile(bucketName, tgtFileKey); diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java index dde2082..bc78fc0 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java @@ -69,15 +69,13 @@ public class FileServiceImpl implements FileService { @Override public void delete(ServerFileDeleteDto dto) { log.info("delete dto = {}", JsonUtil.obj2Str(dto)); + // 检查app code checkAppCode(dto.getAppCode()); - if (Utility.isBlank(dto.getUrl())) { - log.warn("delete url is null"); - return; - } String urlMd5 = Utility.getMd5(dto.getUrl()); log.info("delete urlMd5 = {}", urlMd5); - File file = fileDao.getFileByUrlMd5(urlMd5); + + File file = fileDao.getByAppCodeAndUrlMd5(dto.getAppCode(), urlMd5); if (Utility.objIsNull(file)) { log.warn("delete file is null,url = {}, urlMd5 = {}", dto.getUrl(), urlMd5); return; @@ -88,11 +86,11 @@ public class FileServiceImpl implements FileService { log.info("delete deleteFlag = {}", deleteFlag); if (deleteFlag) { File updateFile = new File(); - updateFile.setIsDelete(TableDelete.DELETE); + updateFile.setIsDelete(TableDelete.DELETED); updateFile.setStatus(FileStatus.DELETED); updateFile.setUpdateBy(dto.getOperator()); updateFile.setId(file.getId()); - fileDao.updateById(file); + fileDao.updateById(updateFile); } } @@ -116,12 +114,8 @@ public class FileServiceImpl implements FileService { public ServerFileUploadResponse upload(ServerFileUploadDto dto) { log.info("update fileName:{},appCode:{},bizScene:{}", dto.getFileName(), dto.getAppCode(), dto.getBizScene()); - - FileApp fileAppByAppCode = fileAppDao.getByAppCode(dto.getAppCode()); - if (fileAppByAppCode == null) { - log.error("upload 未找到对应编码 appCode:{}", dto.getAppCode()); - throw new BizException(CodeEnum.APP_CODE_NOT_FOUND); - } + // 检查appCode + checkAppCode(dto.getAppCode()); List appChannelBuckets = appChannelBucketDao .getByAppCode(dto.getAppCode()); @@ -207,16 +201,12 @@ public class FileServiceImpl implements FileService { String uuid = Utility.getUUID(); - // 上传文件 - StringBuilder builder = new StringBuilder(); - builder.append(fileUploadConfig.getDirectory()); - builder.append("/"); - builder.append(uuid); - builder.append("."); - builder.append(fileFormats); + + // 生成上传文件的唯一key + String tgtFileKey = Utility.generateFileKey(fileUploadConfig.getDirectory(), uuid, fileFormats); String fileUrl = fileManager.uploadByStream( - fileUploadConfig.getBucketName(), builder.toString(), dto.getFileContent()); + fileUploadConfig.getBucketName(), tgtFileKey, dto.getFileContent()); if (Utility.isBlank(fileUrl)) { ossFile.setStatus(FileStatusEnum.STATUS_UPLOAD_FAIL.getCode()); fileDao.save(ossFile); From 2451b8c2b3def06311a767bc851f045da68b5569 Mon Sep 17 00:00:00 2001 From: zhangran Date: Tue, 3 Aug 2021 17:31:31 +0800 Subject: [PATCH 22/31] =?UTF-8?q?add-=E5=A2=9E=E5=8A=A0manager,=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ServerFileController.java | 1 + .../oss/common/constans/CommonConstants.java | 16 +++ .../oss/common/exception/BizException.java | 15 ++- .../manager/api/AppChannelBucketManager.java | 20 ++++ .../axzo/oss/manager/api/FileAppManager.java | 21 ++++ .../manager/api/FileBusinessSceneManager.java | 20 ++++ .../oss/manager/api/FileChannelManager.java | 28 +++++ .../manager/api/FileUploadConfigManager.java | 20 ++++ .../impl/AppChannelBucketManagerImpl.java | 37 ++++++ .../impl/FileBusinessSceneManagerImpl.java | 38 ++++++ .../manager/impl/FileChannelManagerImpl.java | 50 ++++++++ .../impl/FileUploadConfigManagerImpl.java | 37 ++++++ .../oss/service/impl/FileServiceImpl.java | 112 +++++++----------- 13 files changed, 345 insertions(+), 70 deletions(-) create mode 100644 oss-manager-api/src/main/java/cn/axzo/oss/manager/api/AppChannelBucketManager.java create mode 100644 oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileAppManager.java create mode 100644 oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileBusinessSceneManager.java create mode 100644 oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileChannelManager.java create mode 100644 oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileUploadConfigManager.java create mode 100644 oss-manager/src/main/java/cn/axzo/oss/manager/impl/AppChannelBucketManagerImpl.java create mode 100644 oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileBusinessSceneManagerImpl.java create mode 100644 oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileChannelManagerImpl.java create mode 100644 oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileUploadConfigManagerImpl.java diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java index af12048..de4859d 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java @@ -31,6 +31,7 @@ public class ServerFileController implements ServerFileServiceApi { @Override public CommonResponse upload(@Valid @RequestBody ServerFileUploadRequest request) { ServerFileUploadDto dto = BeanConvertUtil.copyBean(request, ServerFileUploadDto.class); + request.setFileContent(null); return CommonResponse.success(fileService.upload(dto)); } diff --git a/oss-common/src/main/java/cn/axzo/oss/common/constans/CommonConstants.java b/oss-common/src/main/java/cn/axzo/oss/common/constans/CommonConstants.java index 50cf6a3..ea54966 100644 --- a/oss-common/src/main/java/cn/axzo/oss/common/constans/CommonConstants.java +++ b/oss-common/src/main/java/cn/axzo/oss/common/constans/CommonConstants.java @@ -19,6 +19,22 @@ public abstract class CommonConstants { */ public static final String DOT = "."; + /** + * 逗号 + */ + public static final String COMMA = ","; + + /** + * 在指定字符串未找字符串的位置 + */ + public static final int NOT_FOUND_INDEX_OF = -1; + /** + * 1 + */ + public static final int ONE = 1; + + + /** * 是否删除 */ diff --git a/oss-common/src/main/java/cn/axzo/oss/common/exception/BizException.java b/oss-common/src/main/java/cn/axzo/oss/common/exception/BizException.java index df3cb55..f50ea4e 100644 --- a/oss-common/src/main/java/cn/axzo/oss/common/exception/BizException.java +++ b/oss-common/src/main/java/cn/axzo/oss/common/exception/BizException.java @@ -3,6 +3,8 @@ package cn.axzo.oss.common.exception; import cn.axzo.oss.common.enums.CodeEnum; import lombok.Getter; import lombok.Setter; +import org.springframework.lang.Nullable; +import org.springframework.util.ObjectUtils; /** * 业务异常 @@ -60,25 +62,25 @@ public class BizException extends RuntimeException { } public static void error(boolean b, CodeEnum returnCode) { - if (!b) { + if (b) { throw new BizException(returnCode.getCode(), returnCode.getMessage(), null); } } public static void error(boolean b, CodeEnum returnCode, String message) { - if (!b) { + if (b) { throw new BizException(returnCode.getCode(), message, null); } } public static void error(boolean b, Integer code, String message) { - if (!b) { + if (b) { throw new BizException(code, message, null); } } public static void error(boolean b, Integer code, String message, Object data) { - if (!b) { + if (b) { throw new BizException(code, message, data); } } @@ -87,4 +89,9 @@ public class BizException extends RuntimeException { throw new BizException(returnCode.getCode(), returnCode.getMessage(), null); } + public static void isEmpty(@Nullable Object obj, CodeEnum returnCode) { + if (ObjectUtils.isEmpty(obj)) { + throw new BizException(returnCode.getCode(), returnCode.getMessage(), null); + } + } } diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/AppChannelBucketManager.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/AppChannelBucketManager.java new file mode 100644 index 0000000..0503b8f --- /dev/null +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/AppChannelBucketManager.java @@ -0,0 +1,20 @@ +package cn.axzo.oss.manager.api; + +import cn.axzo.oss.dal.entity.AppChannelBucket; +import java.util.List; + +/** + * @author: zhangran + * @date: 20210803 15:30 + * @description: + **/ +public interface AppChannelBucketManager { + + /** + * 通过appcode获取文件渠道桶信息 + * + * @param appCode appcode + * @return + */ + List getByAppCode(String appCode); +} diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileAppManager.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileAppManager.java new file mode 100644 index 0000000..01a16ff --- /dev/null +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileAppManager.java @@ -0,0 +1,21 @@ +package cn.axzo.oss.manager.api; + +import cn.axzo.oss.dal.entity.FileApp; + +/** + * @author: zhangran + * @date: 20210803 15:28 + * @description: + **/ +public interface FileAppManager { + + /** + * 通过appCode获取应用信息 + * + * @param appCode + * @return + */ + FileApp getByAppCode(String appCode); + + +} diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileBusinessSceneManager.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileBusinessSceneManager.java new file mode 100644 index 0000000..772b09e --- /dev/null +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileBusinessSceneManager.java @@ -0,0 +1,20 @@ +package cn.axzo.oss.manager.api; + +import cn.axzo.oss.dal.entity.FileBusinessScene; + +/** + * @author: zhangran + * @date: 20210803 15:42 + * @description: + **/ +public interface FileBusinessSceneManager { + + /** + * 指定appcode文件业务场景 + * + * @param bucketNo 应用编码 + * @param bizScene + * @return + */ + FileBusinessScene getByBucketNoAndScene(String bucketNo,String bizScene); +} diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileChannelManager.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileChannelManager.java new file mode 100644 index 0000000..ff7e6fd --- /dev/null +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileChannelManager.java @@ -0,0 +1,28 @@ +package cn.axzo.oss.manager.api; + +import cn.axzo.oss.dal.entity.FileChannel; +import java.util.List; + +/** + * @author: zhangran + * @date: 20210803 15:33 + * @description: + **/ +public interface FileChannelManager { + + /** + * 返回所有渠道 按优先级升序返回 + * + * @param channelCodes + * @return + */ + List listChannelCodeOrderByPriorityAsc(List channelCodes); + + /** + * 返回一个最优的渠道 升序第一个 + * + * @param channelCodes + * @return + */ + FileChannel getOptimalChannel(List channelCodes); +} diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileUploadConfigManager.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileUploadConfigManager.java new file mode 100644 index 0000000..e3229fc --- /dev/null +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileUploadConfigManager.java @@ -0,0 +1,20 @@ +package cn.axzo.oss.manager.api; + +import cn.axzo.oss.dal.entity.FileUploadConfig; + +/** + * @author: zhangran + * @date: 20210803 15:43 + * @description: + **/ +public interface FileUploadConfigManager { + + /** + * 通过渠道码和桶名称获取获取指定上传配置 + * + * @param bucketNo + * @param directory + * @return + */ + FileUploadConfig getByUploadConfig(String bucketNo, String directory); +} diff --git a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/AppChannelBucketManagerImpl.java b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/AppChannelBucketManagerImpl.java new file mode 100644 index 0000000..2afbf9b --- /dev/null +++ b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/AppChannelBucketManagerImpl.java @@ -0,0 +1,37 @@ +package cn.axzo.oss.manager.impl; + +import cn.axzo.oss.common.enums.CodeEnum; +import cn.axzo.oss.common.exception.BizException; +import cn.axzo.oss.dal.entity.AppChannelBucket; +import cn.axzo.oss.dal.repository.AppChannelBucketDao; +import cn.axzo.oss.manager.api.AppChannelBucketManager; +import java.util.List; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author: zhangran + * @date: 20210803 15:44 + * @description: + **/ +@Service +@Slf4j +public class AppChannelBucketManagerImpl implements AppChannelBucketManager { + + @Autowired + private AppChannelBucketDao appChannelBucketDao; + + /** + * 通过appcode获取文件渠道桶信息 + * + * @param appCode appcode + * @return + */ + @Override + public List getByAppCode(String appCode) { + List appChannelBuckets = appChannelBucketDao.getByAppCode(appCode); + BizException.isEmpty(appChannelBuckets, CodeEnum.APP_CHANNEL_BUCKET_NOT_FOUND); + return appChannelBuckets; + } +} diff --git a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileBusinessSceneManagerImpl.java b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileBusinessSceneManagerImpl.java new file mode 100644 index 0000000..7e542ce --- /dev/null +++ b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileBusinessSceneManagerImpl.java @@ -0,0 +1,38 @@ +package cn.axzo.oss.manager.impl; + +import cn.axzo.oss.common.enums.CodeEnum; +import cn.axzo.oss.common.exception.BizException; +import cn.axzo.oss.dal.entity.FileBusinessScene; +import cn.axzo.oss.dal.repository.FileBusinessSceneDao; +import cn.axzo.oss.manager.api.FileBusinessSceneManager; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author: zhangran + * @date: 20210803 16:36 + * @description: + **/ +@Service +@Slf4j +public class FileBusinessSceneManagerImpl implements FileBusinessSceneManager { + + @Autowired + private FileBusinessSceneDao fileBusinessSceneDao; + + /** + * 指定appcode文件业务场景 + * + * @param bucketNo 应用编码 + * @param bizScene + * @return + */ + @Override + public FileBusinessScene getByBucketNoAndScene(String bucketNo, String bizScene) { + FileBusinessScene fileBusinessScene = fileBusinessSceneDao + .getByBucketNoAndScene(bucketNo, bizScene); + BizException.isEmpty(fileBusinessScene, CodeEnum.APP_CHANNEL_NOT_FOUND); + return fileBusinessScene; + } +} diff --git a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileChannelManagerImpl.java b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileChannelManagerImpl.java new file mode 100644 index 0000000..0e913ba --- /dev/null +++ b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileChannelManagerImpl.java @@ -0,0 +1,50 @@ +package cn.axzo.oss.manager.impl; + +import cn.axzo.oss.common.enums.CodeEnum; +import cn.axzo.oss.common.exception.BizException; +import cn.axzo.oss.dal.entity.FileChannel; +import cn.axzo.oss.dal.repository.FileChannelDao; +import cn.axzo.oss.manager.api.FileChannelManager; +import java.util.List; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author: zhangran + * @date: 20210803 16:28 + * @description: + **/ +@Service +@Slf4j +public class FileChannelManagerImpl implements FileChannelManager { + + @Autowired + private FileChannelDao fileChannelDao; + + /** + * 返回所有渠道 按优先级升序返回 + * + * @param channelCodes + * @return + */ + @Override + public List listChannelCodeOrderByPriorityAsc(List channelCodes) { + List fileChannels = fileChannelDao.getByChannelCode(channelCodes); + BizException.isEmpty(fileChannels, CodeEnum.APP_CHANNEL_NOT_FOUND); + return fileChannels; + } + + /** + * 返回一个最优的渠道 升序第一个 + * + * @param channelCodes + * @return + */ + @Override + public FileChannel getOptimalChannel(List channelCodes) { + List fileChannels = fileChannelDao.getByChannelCode(channelCodes); + BizException.isEmpty(fileChannels, CodeEnum.APP_CHANNEL_NOT_FOUND); + return fileChannels.get(0); + } +} diff --git a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileUploadConfigManagerImpl.java b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileUploadConfigManagerImpl.java new file mode 100644 index 0000000..9b8f94b --- /dev/null +++ b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileUploadConfigManagerImpl.java @@ -0,0 +1,37 @@ +package cn.axzo.oss.manager.impl; + +import cn.axzo.oss.common.enums.CodeEnum; +import cn.axzo.oss.common.exception.BizException; +import cn.axzo.oss.dal.entity.FileUploadConfig; +import cn.axzo.oss.dal.repository.FileUploadConfigDao; +import cn.axzo.oss.manager.api.FileUploadConfigManager; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author: zhangran + * @date: 20210803 16:39 + * @description: + **/ +@Service +@Slf4j +public class FileUploadConfigManagerImpl implements FileUploadConfigManager { + + @Autowired + private FileUploadConfigDao fileUploadConfigDao; + + /** + * 通过渠道码和桶名称获取获取指定上传配置 + * + * @param bucketNo + * @param directory + * @return + */ + @Override + public FileUploadConfig getByUploadConfig(String bucketNo, String directory) { + FileUploadConfig uploadConfig = fileUploadConfigDao.getByUploadConfig(bucketNo, directory); + BizException.isEmpty(uploadConfig, CodeEnum.NO_UPLOAD_CONFIG); + return uploadConfig; + } +} diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java index bc78fc0..03e81c4 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java @@ -1,5 +1,6 @@ package cn.axzo.oss.service.impl; +import cn.axzo.oss.common.constans.CommonConstants; import cn.axzo.oss.common.constans.CommonConstants.FileStatus; import cn.axzo.oss.common.constans.CommonConstants.TableDelete; import cn.axzo.oss.common.enums.CodeEnum; @@ -13,13 +14,13 @@ import cn.axzo.oss.dal.entity.FileApp; import cn.axzo.oss.dal.entity.FileBusinessScene; import cn.axzo.oss.dal.entity.FileChannel; import cn.axzo.oss.dal.entity.FileUploadConfig; -import cn.axzo.oss.dal.repository.AppChannelBucketDao; import cn.axzo.oss.dal.repository.FileAppDao; -import cn.axzo.oss.dal.repository.FileBusinessSceneDao; -import cn.axzo.oss.dal.repository.FileChannelDao; import cn.axzo.oss.dal.repository.FileDao; -import cn.axzo.oss.dal.repository.FileUploadConfigDao; +import cn.axzo.oss.manager.api.AppChannelBucketManager; +import cn.axzo.oss.manager.api.FileBusinessSceneManager; +import cn.axzo.oss.manager.api.FileChannelManager; import cn.axzo.oss.manager.api.FileManager; +import cn.axzo.oss.manager.api.FileUploadConfigManager; import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; import cn.axzo.oss.manager.api.dto.request.ServerFileUploadDto; import cn.axzo.oss.manager.api.dto.response.ServerFileUploadResponse; @@ -31,7 +32,6 @@ import java.util.List; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.util.ObjectUtils; /** * @Author admin @@ -52,13 +52,13 @@ public class FileServiceImpl implements FileService { @Autowired private FileAppDao fileAppDao; @Autowired - private AppChannelBucketDao appChannelBucketDao; + private AppChannelBucketManager appChannelBucketManager; @Autowired - private FileChannelDao fileChannelDao; + private FileChannelManager fileChannelManager; @Autowired - private FileBusinessSceneDao fileBusinessSceneDao; + private FileBusinessSceneManager fileBusinessSceneManager; @Autowired - private FileUploadConfigDao fileUploadConfigDao; + private FileUploadConfigManager fileUploadConfigManager; /** @@ -80,7 +80,8 @@ public class FileServiceImpl implements FileService { log.warn("delete file is null,url = {}, urlMd5 = {}", dto.getUrl(), urlMd5); return; } - String tgtFileKey = Utility.generateFileKey(file.getDirectory(), file.getFileUuid(), file.getFileFormat()); + String tgtFileKey = Utility + .generateFileKey(file.getDirectory(), file.getFileUuid(), file.getFileFormat()); log.debug("delete tgtFileKey = {}", tgtFileKey); boolean deleteFlag = fileManager.delete(file.getBucketName(), tgtFileKey); log.info("delete deleteFlag = {}", deleteFlag); @@ -97,9 +98,10 @@ public class FileServiceImpl implements FileService { /** * 检查appCode是否有效 + * * @param appCode */ - private void checkAppCode(final String appCode){ + private void checkAppCode(final String appCode) { log.info("checkAppCode appCode = {}", appCode); FileApp fileApp = fileAppDao.getByAppCode(appCode); BizException.error(Utility.objIsNull(fileApp), CodeEnum.APP_CODE_NOT_FOUND); @@ -117,74 +119,33 @@ public class FileServiceImpl implements FileService { // 检查appCode checkAppCode(dto.getAppCode()); - List appChannelBuckets = appChannelBucketDao + // 通过appcode获取文件渠道桶信息 + List appChannelBuckets = appChannelBucketManager .getByAppCode(dto.getAppCode()); - if (ObjectUtils.isEmpty(appChannelBuckets)) { - log.error("upload 文件渠道桶信息不存在 appCode:{}", dto.getAppCode()); - throw new BizException(CodeEnum.APP_CHANNEL_BUCKET_NOT_FOUND); - } - // todo 判断权限 + // 暂无权限判断 // 找到最优渠道 ArrayList channels = Lists.newArrayList(); appChannelBuckets.forEach(appChannelBucket -> channels.add(appChannelBucket.getChannelCode())); + FileChannel fileChannel = fileChannelManager.getOptimalChannel(channels); - List fileChannels = fileChannelDao.getByChannelCode(channels); - if (ObjectUtils.isEmpty(fileChannels)) { - log.error("upload 最优渠道为空 channels:{}", channels); - throw new BizException(CodeEnum.APP_CHANNEL_NOT_FOUND); - } - - FileChannel fileChannel = fileChannels.get(0); AppChannelBucket appChannelBucket = appChannelBuckets.stream().filter(bucket -> bucket.getChannelCode().equals(fileChannel.getChannelCode())) .findFirst().orElse(null); - if (appChannelBucket == null) { - log.error("upload 最优渠道为空 channels:{}", channels); - throw new BizException(CodeEnum.APP_CHANNEL_NOT_FOUND); - } + BizException.isEmpty(appChannelBucket, CodeEnum.APP_CHANNEL_NOT_FOUND); // 通过渠道桶编码获取到具体文件业务场景 - FileBusinessScene scene = fileBusinessSceneDao + FileBusinessScene scene = fileBusinessSceneManager .getByBucketNoAndScene(appChannelBucket.getAppChannelBucketNo(), dto.getBizScene()); - if (scene == null) { - log.error("upload 渠道不存在 appCode:{},bizScene:{}", dto.getAppCode(), dto.getBizScene()); - throw new BizException(CodeEnum.APP_CHANNEL_NOT_FOUND); - } - FileUploadConfig fileUploadConfig = fileUploadConfigDao + // 通过渠道码和桶名称获取获取指定上传配置 + FileUploadConfig fileUploadConfig = fileUploadConfigManager .getByUploadConfig(scene.getAppChannelBucketNo(), scene.getDirectory()); - if (fileUploadConfig == null) { - log.error("upload 上传配置不存在 bucketNo:{},bucketName:{}", scene.getAppChannelBucketNo() - , scene.getBucketName()); - throw new BizException(CodeEnum.NO_UPLOAD_CONFIG); - } // 判断容量 - int size = Utility - .capacityConversion(fileUploadConfig.getStorageSize(), fileUploadConfig.getStorageUnit()); - if (dto.getFileContent().length > size) { - log.error("upload 文件大小超出上限 file size:{},storageSize:{}", dto.getFileContent().length - , size); - throw new BizException(CodeEnum.FILE_SIZE_EXCEEDS_LIMIT); - } - // 文件格式判断 - String[] formats = fileUploadConfig.getFileFormat().split(","); - - int lastIndexOf = dto.getFileName().lastIndexOf("."); - if (lastIndexOf == -1) { - log.error("获取文件格式失败:{}", dto.getFileName()); - throw new BizException(CodeEnum.NOT_FILE_FORMAT); - } - - String fileFormats = dto.getFileName().substring(lastIndexOf + 1).toLowerCase(); - boolean contains = Arrays.asList(formats).contains(fileFormats); - if (!contains) { - log.error("不支持此格式文件fileName:{},formats:{}", dto.getFileName(), formats); - throw new BizException(CodeEnum.FILE_FORMAT_NOT_SUPPORTED); - } - String md5 = Utility.getMd5(dto.getFileContent()); + String fileConform = isFileConform(fileUploadConfig, dto.getFileContent().length, + dto.getFileName()); File ossFile = new File(); ossFile.setAppChannelBucketNo(fileUploadConfig.getAppChannelBucketNo()); @@ -192,18 +153,17 @@ public class FileServiceImpl implements FileService { ossFile.setChannelCode(fileUploadConfig.getChannelCode()); ossFile.setBucketName(fileUploadConfig.getBucketName()); ossFile.setDirectory(fileUploadConfig.getDirectory()); - ossFile.setFileMd5(md5); + ossFile.setFileMd5(Utility.getMd5(dto.getFileContent())); ossFile.setStatus(FileStatusEnum.STATUS_PROCESSING.getCode()); - ossFile.setFileFormat(fileFormats); + ossFile.setFileFormat(fileConform); ossFile.setFileName(dto.getFileName()); ossFile.setStorageUnit(fileUploadConfig.getStorageUnit()); ossFile.setStorageSize(fileUploadConfig.getStorageSize()); String uuid = Utility.getUUID(); - // 生成上传文件的唯一key - String tgtFileKey = Utility.generateFileKey(fileUploadConfig.getDirectory(), uuid, fileFormats); + String tgtFileKey = Utility.generateFileKey(fileUploadConfig.getDirectory(), uuid, fileConform); String fileUrl = fileManager.uploadByStream( fileUploadConfig.getBucketName(), tgtFileKey, dto.getFileContent()); @@ -227,5 +187,25 @@ public class FileServiceImpl implements FileService { return response; } + /** + * 判断文件是否符合要求 + */ + private String isFileConform(FileUploadConfig fileUploadConfig, int fileLength, String fileName) { + // 文件大小超出上限 + int size = Utility + .capacityConversion(fileUploadConfig.getStorageSize(), fileUploadConfig.getStorageUnit()); + BizException.error(fileLength > size, CodeEnum.FILE_SIZE_EXCEEDS_LIMIT); + // 文件格式判断 + String[] formats = fileUploadConfig.getFileFormat().split(CommonConstants.COMMA); + int lastIndexOf = fileName.lastIndexOf(CommonConstants.DOT); + BizException.error(lastIndexOf == CommonConstants.NOT_FOUND_INDEX_OF, CodeEnum.NOT_FILE_FORMAT); + + // 是否包含指定格式 + String fileFormat = fileName.substring(lastIndexOf + CommonConstants.ONE).toLowerCase(); + boolean contains = Arrays.asList(formats).contains(fileFormat); + BizException.error(!contains, CodeEnum.FILE_FORMAT_NOT_SUPPORTED); + + return fileFormat; + } } From c6cb7f1f9733a63b5e0494d0248dc1a11631122b Mon Sep 17 00:00:00 2001 From: zhangran Date: Tue, 3 Aug 2021 17:44:19 +0800 Subject: [PATCH 23/31] =?UTF-8?q?add-=E5=88=9D=E5=A7=8B=E5=8C=96oss=20sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/sql/ddl/oss_data_init.sql | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 doc/sql/ddl/oss_data_init.sql diff --git a/doc/sql/ddl/oss_data_init.sql b/doc/sql/ddl/oss_data_init.sql new file mode 100644 index 0000000..6886e1b --- /dev/null +++ b/doc/sql/ddl/oss_data_init.sql @@ -0,0 +1,14 @@ +INSERT INTO `app_channel_bucket`( `app_channel_bucket_no`, `app_code`, `channel_code`, `bucket_name`, `access_control`, `remark`, `extension`, `create_at`, `update_at`, `create_by`, `update_by`, `is_delete`) +VALUES ( 'test:aliyun:test', 'test', 'aliyun', 'axzo_public', '', NULL, NULL, now(), now(), '', '', 0); + +INSERT INTO `file_app`(`app_code`, `app_name`, `status`, `remark`, `extension`, `create_at`, `update_at`, `create_by`, `update_by`, `is_delete`) +VALUES ('test', '测试', 1, '测试', NULL, now(), now(), '', '', 0); + +INSERT INTO `file_business_scene`(`app_channel_bucket_no`, `app_code`, `channel_code`, `bucket_name`, `business_scene`, `directory`, `create_at`, `update_at`, `create_by`, `update_by`, `is_delete`) +VALUES ('test:aliyun:test', 'test', 'aliyun', 'axzo_public', '1', 'oss-test', now(), now(), NULL, NULL, 0); + +INSERT INTO `file_channel`(`channel_code`, `channel_name`, `status`, `remark`, `extension`, `priority`, `create_at`, `update_at`, `create_by`, `update_by`, `is_delete`) +VALUES ('aliyun', '阿里云', 1, NULL, NULL, 1, now(), now(), NULL, NULL, 0); + +INSERT INTO `file_upload_config`(`app_channel_bucket_no`, `app_code`, `channel_code`, `bucket_name`, `directory`, `storage_unit`, `storage_size`, `file_format`, `create_at`, `update_at`, `create_by`, `update_by`, `is_delete`) +VALUES ('test:aliyun:test', 'test', 'aliyun', 'axzo-public', 'oss-test', 'MB', 1, 'jpg', now(), now(), NULL, NULL, 0); \ No newline at end of file From a89806619b62e7c0cb7ba971816c23a4b59c45f9 Mon Sep 17 00:00:00 2001 From: zhangran Date: Wed, 4 Aug 2021 19:53:59 +0800 Subject: [PATCH 24/31] =?UTF-8?q?fix-=E5=88=9D=E5=A7=8B=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=EF=BC=8C=E7=AB=AF=E5=8F=A3=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/sql/ddl/oss_data_init.sql | 8 ++++---- .../java/cn/axzo/oss/http/api/ServerFileServiceApi.java | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/sql/ddl/oss_data_init.sql b/doc/sql/ddl/oss_data_init.sql index 6886e1b..ae4f212 100644 --- a/doc/sql/ddl/oss_data_init.sql +++ b/doc/sql/ddl/oss_data_init.sql @@ -1,14 +1,14 @@ INSERT INTO `app_channel_bucket`( `app_channel_bucket_no`, `app_code`, `channel_code`, `bucket_name`, `access_control`, `remark`, `extension`, `create_at`, `update_at`, `create_by`, `update_by`, `is_delete`) -VALUES ( 'test:aliyun:test', 'test', 'aliyun', 'axzo_public', '', NULL, NULL, now(), now(), '', '', 0); +VALUES ( 'zeus:aliyun:zeus', 'zeus', 'aliyun', 'axzo_public', '', NULL, NULL, now(), now(), '', '', 0); INSERT INTO `file_app`(`app_code`, `app_name`, `status`, `remark`, `extension`, `create_at`, `update_at`, `create_by`, `update_by`, `is_delete`) -VALUES ('test', '测试', 1, '测试', NULL, now(), now(), '', '', 0); +VALUES ('zeus', 'zeus', 1, 'zeus', NULL, now(), now(), '', '', 0); INSERT INTO `file_business_scene`(`app_channel_bucket_no`, `app_code`, `channel_code`, `bucket_name`, `business_scene`, `directory`, `create_at`, `update_at`, `create_by`, `update_by`, `is_delete`) -VALUES ('test:aliyun:test', 'test', 'aliyun', 'axzo_public', '1', 'oss-test', now(), now(), NULL, NULL, 0); +VALUES ('zeus:aliyun:zeus', 'zeus', 'aliyun', 'axzo_public', 'xlsx', 'oss-test/zeus', now(), now(), NULL, NULL, 0); INSERT INTO `file_channel`(`channel_code`, `channel_name`, `status`, `remark`, `extension`, `priority`, `create_at`, `update_at`, `create_by`, `update_by`, `is_delete`) VALUES ('aliyun', '阿里云', 1, NULL, NULL, 1, now(), now(), NULL, NULL, 0); INSERT INTO `file_upload_config`(`app_channel_bucket_no`, `app_code`, `channel_code`, `bucket_name`, `directory`, `storage_unit`, `storage_size`, `file_format`, `create_at`, `update_at`, `create_by`, `update_by`, `is_delete`) -VALUES ('test:aliyun:test', 'test', 'aliyun', 'axzo-public', 'oss-test', 'MB', 1, 'jpg', now(), now(), NULL, NULL, 0); \ No newline at end of file +VALUES ('zeus:aliyun:zeus', 'zeus', 'aliyun', 'axzo-public', 'oss-test/zeus', 'MB', 5, 'jpg', now(), now(), NULL, NULL, 0); \ No newline at end of file diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/api/ServerFileServiceApi.java b/oss-http-api/src/main/java/cn/axzo/oss/http/api/ServerFileServiceApi.java index 133b504..ec590f9 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/api/ServerFileServiceApi.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/api/ServerFileServiceApi.java @@ -17,7 +17,7 @@ import org.springframework.web.bind.annotation.RequestMethod; */ @FeignClient( name = "oss", - url = "http://oss" + url = "http://oss:9123" ) @RequestMapping(value = "/api/v1/server") public interface ServerFileServiceApi { From 2e9d71a2e37f51e0a8c9f146c837afa888601330 Mon Sep 17 00:00:00 2001 From: zhangran Date: Thu, 5 Aug 2021 10:10:24 +0800 Subject: [PATCH 25/31] =?UTF-8?q?fix-noacos=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oss-client/src/main/resources/bootstrap.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/oss-client/src/main/resources/bootstrap.yml b/oss-client/src/main/resources/bootstrap.yml index 64596a6..5d6f794 100644 --- a/oss-client/src/main/resources/bootstrap.yml +++ b/oss-client/src/main/resources/bootstrap.yml @@ -6,10 +6,10 @@ spring: config: server-addr: ${NACOS_HOST:dev-nacos.axzo.cn}:${NACOS_PORT:80} file-extension: yaml - namespace: ${NACOS_NAMESPACE_ID:f82179f1-81a9-41a1-a489-4f9ab5660a6e} + namespace: ${NACOS_NAMESPACE_ID:35eada10-9574-4db8-9fea-bc6a4960b6c7} prefix: ${spring.application.name} profiles: - active: ${NACOS_PROFILES_ACTIVE:local} + active: ${NACOS_PROFILES_ACTIVE:dev} main: allow-bean-definition-overriding: true From 44532aa25761eec5957a090bd1527f9aa1696e3f Mon Sep 17 00:00:00 2001 From: zhangran Date: Thu, 5 Aug 2021 13:14:39 +0800 Subject: [PATCH 26/31] =?UTF-8?q?fix-=E5=88=A0=E9=99=A4=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E5=85=B3=E9=97=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/sql/ddl/oss_data_init.sql | 2 +- .../java/cn/axzo/oss/integration/s3/impl/AliOssServiceImpl.java | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/doc/sql/ddl/oss_data_init.sql b/doc/sql/ddl/oss_data_init.sql index ae4f212..2c7ca50 100644 --- a/doc/sql/ddl/oss_data_init.sql +++ b/doc/sql/ddl/oss_data_init.sql @@ -5,7 +5,7 @@ INSERT INTO `file_app`(`app_code`, `app_name`, `status`, `remark`, `extension`, VALUES ('zeus', 'zeus', 1, 'zeus', NULL, now(), now(), '', '', 0); INSERT INTO `file_business_scene`(`app_channel_bucket_no`, `app_code`, `channel_code`, `bucket_name`, `business_scene`, `directory`, `create_at`, `update_at`, `create_by`, `update_by`, `is_delete`) -VALUES ('zeus:aliyun:zeus', 'zeus', 'aliyun', 'axzo_public', 'xlsx', 'oss-test/zeus', now(), now(), NULL, NULL, 0); +VALUES ('zeus:aliyun:zeus', 'zeus', 'aliyun', 'axzo_public', 'recruit_collect', 'oss-test/zeus', now(), now(), NULL, NULL, 0); INSERT INTO `file_channel`(`channel_code`, `channel_name`, `status`, `remark`, `extension`, `priority`, `create_at`, `update_at`, `create_by`, `update_by`, `is_delete`) VALUES ('aliyun', '阿里云', 1, NULL, NULL, 1, now(), now(), NULL, NULL, 0); diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/AliOssServiceImpl.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/AliOssServiceImpl.java index fa34d14..57821c9 100644 --- a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/AliOssServiceImpl.java +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/AliOssServiceImpl.java @@ -40,8 +40,6 @@ public class AliOssServiceImpl implements AliOssService { } catch (ClientException e) { log.error("uploadByStream ClientException", e); return ""; - } finally { - client.shutdown(); } StringBuilder allBuilder = new StringBuilder(); From 44c877d2e128f784fab0914cc39e5c313394edcc Mon Sep 17 00:00:00 2001 From: zhaoyong Date: Thu, 5 Aug 2021 13:15:50 +0800 Subject: [PATCH 27/31] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/sql/ddl/20210716_oss_init.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/sql/ddl/20210716_oss_init.sql b/doc/sql/ddl/20210716_oss_init.sql index 78c405b..f6fe324 100644 --- a/doc/sql/ddl/20210716_oss_init.sql +++ b/doc/sql/ddl/20210716_oss_init.sql @@ -120,7 +120,7 @@ CREATE TABLE `file` ( `is_delete` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否逻辑删除(0:未删除,1:已删除)', PRIMARY KEY (`id`), INDEX idx_create_at(create_at), + INDEX idx_url_md5_app_code(url_md5, app_code), UNIQUE KEY uk_file_uuid(`file_uuid`), - UNIQUE KEY uk_file_md5(`file_uuid`), UNIQUE KEY idx_app_code_bucket_name_file_url(`app_channel_bucket_no`, `directory`, `file_uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文件上传记录'; \ No newline at end of file From bd41c0d035c64ed955ab6e871d3bdfec7de92915 Mon Sep 17 00:00:00 2001 From: zhangran Date: Thu, 5 Aug 2021 21:00:44 +0800 Subject: [PATCH 28/31] =?UTF-8?q?fix-=E7=AE=80=E5=8C=96=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oss/common/exception/BizException.java | 8 +- .../manager/api/AppChannelBucketManager.java | 2 +- .../oss/manager/api/FileChannelManager.java | 5 +- .../impl/AppChannelBucketManagerImpl.java | 18 ++- .../manager/impl/FileChannelManagerImpl.java | 12 +- .../oss/service/impl/FileServiceImpl.java | 117 +++++++++--------- .../cn/axzo/oss/test/FileServiceTest.java | 11 +- 7 files changed, 96 insertions(+), 77 deletions(-) diff --git a/oss-common/src/main/java/cn/axzo/oss/common/exception/BizException.java b/oss-common/src/main/java/cn/axzo/oss/common/exception/BizException.java index f50ea4e..1513c64 100644 --- a/oss-common/src/main/java/cn/axzo/oss/common/exception/BizException.java +++ b/oss-common/src/main/java/cn/axzo/oss/common/exception/BizException.java @@ -62,25 +62,25 @@ public class BizException extends RuntimeException { } public static void error(boolean b, CodeEnum returnCode) { - if (b) { + if (!b) { throw new BizException(returnCode.getCode(), returnCode.getMessage(), null); } } public static void error(boolean b, CodeEnum returnCode, String message) { - if (b) { + if (!b) { throw new BizException(returnCode.getCode(), message, null); } } public static void error(boolean b, Integer code, String message) { - if (b) { + if (!b) { throw new BizException(code, message, null); } } public static void error(boolean b, Integer code, String message, Object data) { - if (b) { + if (!b) { throw new BizException(code, message, data); } } diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/AppChannelBucketManager.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/AppChannelBucketManager.java index 0503b8f..00d1b7b 100644 --- a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/AppChannelBucketManager.java +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/AppChannelBucketManager.java @@ -16,5 +16,5 @@ public interface AppChannelBucketManager { * @param appCode appcode * @return */ - List getByAppCode(String appCode); + AppChannelBucket getByAppCode(String appCode); } diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileChannelManager.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileChannelManager.java index ff7e6fd..be1a250 100644 --- a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileChannelManager.java +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileChannelManager.java @@ -1,5 +1,6 @@ package cn.axzo.oss.manager.api; +import cn.axzo.oss.dal.entity.AppChannelBucket; import cn.axzo.oss.dal.entity.FileChannel; import java.util.List; @@ -21,8 +22,8 @@ public interface FileChannelManager { /** * 返回一个最优的渠道 升序第一个 * - * @param channelCodes + * @param appChannelBuckets * @return */ - FileChannel getOptimalChannel(List channelCodes); + FileChannel getOptimalChannel(List appChannelBuckets ); } diff --git a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/AppChannelBucketManagerImpl.java b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/AppChannelBucketManagerImpl.java index 2afbf9b..0e2b155 100644 --- a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/AppChannelBucketManagerImpl.java +++ b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/AppChannelBucketManagerImpl.java @@ -3,8 +3,10 @@ package cn.axzo.oss.manager.impl; import cn.axzo.oss.common.enums.CodeEnum; import cn.axzo.oss.common.exception.BizException; import cn.axzo.oss.dal.entity.AppChannelBucket; +import cn.axzo.oss.dal.entity.FileChannel; import cn.axzo.oss.dal.repository.AppChannelBucketDao; import cn.axzo.oss.manager.api.AppChannelBucketManager; +import cn.axzo.oss.manager.api.FileChannelManager; import java.util.List; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -22,6 +24,9 @@ public class AppChannelBucketManagerImpl implements AppChannelBucketManager { @Autowired private AppChannelBucketDao appChannelBucketDao; + @Autowired + private FileChannelManager fileChannelManager; + /** * 通过appcode获取文件渠道桶信息 * @@ -29,9 +34,18 @@ public class AppChannelBucketManagerImpl implements AppChannelBucketManager { * @return */ @Override - public List getByAppCode(String appCode) { + public AppChannelBucket getByAppCode(String appCode) { List appChannelBuckets = appChannelBucketDao.getByAppCode(appCode); BizException.isEmpty(appChannelBuckets, CodeEnum.APP_CHANNEL_BUCKET_NOT_FOUND); - return appChannelBuckets; + + // 找到最优渠道 + FileChannel fileChannel = fileChannelManager.getOptimalChannel(appChannelBuckets); + + AppChannelBucket appChannelBucket = appChannelBuckets.stream().filter(bucket -> + bucket.getChannelCode().equals(fileChannel.getChannelCode())) + .findFirst().orElse(null); + BizException.isEmpty(appChannelBucket, CodeEnum.APP_CHANNEL_NOT_FOUND); + + return appChannelBucket; } } diff --git a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileChannelManagerImpl.java b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileChannelManagerImpl.java index 0e913ba..529d680 100644 --- a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileChannelManagerImpl.java +++ b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileChannelManagerImpl.java @@ -2,9 +2,12 @@ package cn.axzo.oss.manager.impl; import cn.axzo.oss.common.enums.CodeEnum; import cn.axzo.oss.common.exception.BizException; +import cn.axzo.oss.dal.entity.AppChannelBucket; import cn.axzo.oss.dal.entity.FileChannel; import cn.axzo.oss.dal.repository.FileChannelDao; import cn.axzo.oss.manager.api.FileChannelManager; +import com.google.common.collect.Lists; +import java.util.ArrayList; import java.util.List; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -38,12 +41,15 @@ public class FileChannelManagerImpl implements FileChannelManager { /** * 返回一个最优的渠道 升序第一个 * - * @param channelCodes + * @param appChannelBuckets * @return */ @Override - public FileChannel getOptimalChannel(List channelCodes) { - List fileChannels = fileChannelDao.getByChannelCode(channelCodes); + public FileChannel getOptimalChannel(List appChannelBuckets ) { + ArrayList channels = Lists.newArrayList(); + appChannelBuckets.forEach(appChannelBucket -> channels.add(appChannelBucket.getChannelCode())); + + List fileChannels = fileChannelDao.getByChannelCode(channels); BizException.isEmpty(fileChannels, CodeEnum.APP_CHANNEL_NOT_FOUND); return fileChannels.get(0); } diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java index 03e81c4..f728321 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java @@ -104,7 +104,7 @@ public class FileServiceImpl implements FileService { private void checkAppCode(final String appCode) { log.info("checkAppCode appCode = {}", appCode); FileApp fileApp = fileAppDao.getByAppCode(appCode); - BizException.error(Utility.objIsNull(fileApp), CodeEnum.APP_CODE_NOT_FOUND); + BizException.error(Utility.objIsNotNull(fileApp), CodeEnum.APP_CODE_NOT_FOUND); } /** @@ -120,20 +120,7 @@ public class FileServiceImpl implements FileService { checkAppCode(dto.getAppCode()); // 通过appcode获取文件渠道桶信息 - List appChannelBuckets = appChannelBucketManager - .getByAppCode(dto.getAppCode()); - - // 暂无权限判断 - - // 找到最优渠道 - ArrayList channels = Lists.newArrayList(); - appChannelBuckets.forEach(appChannelBucket -> channels.add(appChannelBucket.getChannelCode())); - FileChannel fileChannel = fileChannelManager.getOptimalChannel(channels); - - AppChannelBucket appChannelBucket = appChannelBuckets.stream().filter(bucket -> - bucket.getChannelCode().equals(fileChannel.getChannelCode())) - .findFirst().orElse(null); - BizException.isEmpty(appChannelBucket, CodeEnum.APP_CHANNEL_NOT_FOUND); + AppChannelBucket appChannelBucket = appChannelBucketManager.getByAppCode(dto.getAppCode()); // 通过渠道桶编码获取到具体文件业务场景 FileBusinessScene scene = fileBusinessSceneManager @@ -143,48 +130,10 @@ public class FileServiceImpl implements FileService { FileUploadConfig fileUploadConfig = fileUploadConfigManager .getByUploadConfig(scene.getAppChannelBucketNo(), scene.getDirectory()); - // 判断容量 - String fileConform = isFileConform(fileUploadConfig, dto.getFileContent().length, - dto.getFileName()); + // 上传文件并生成file对象 + File ossFile = generateFile(fileUploadConfig, dto); - File ossFile = new File(); - ossFile.setAppChannelBucketNo(fileUploadConfig.getAppChannelBucketNo()); - ossFile.setAppCode(fileUploadConfig.getAppCode()); - ossFile.setChannelCode(fileUploadConfig.getChannelCode()); - ossFile.setBucketName(fileUploadConfig.getBucketName()); - ossFile.setDirectory(fileUploadConfig.getDirectory()); - ossFile.setFileMd5(Utility.getMd5(dto.getFileContent())); - ossFile.setStatus(FileStatusEnum.STATUS_PROCESSING.getCode()); - ossFile.setFileFormat(fileConform); - ossFile.setFileName(dto.getFileName()); - ossFile.setStorageUnit(fileUploadConfig.getStorageUnit()); - ossFile.setStorageSize(fileUploadConfig.getStorageSize()); - - String uuid = Utility.getUUID(); - - // 生成上传文件的唯一key - String tgtFileKey = Utility.generateFileKey(fileUploadConfig.getDirectory(), uuid, fileConform); - - String fileUrl = fileManager.uploadByStream( - fileUploadConfig.getBucketName(), tgtFileKey, dto.getFileContent()); - if (Utility.isBlank(fileUrl)) { - ossFile.setStatus(FileStatusEnum.STATUS_UPLOAD_FAIL.getCode()); - fileDao.save(ossFile); - throw new BizException(CodeEnum.FILE_UPLOAD_FAILED); - } - - ossFile.setFileUuid(uuid); - ossFile.setFileUrl(fileUrl); - ossFile.setUrlMd5(Utility.getMd5(fileUrl)); - ossFile.setStatus(FileStatusEnum.STATUS_UPLOAD_SUCCESS.getCode()); - fileDao.save(ossFile); - - ServerFileUploadResponse response = new ServerFileUploadResponse(); - response.setUrl(ossFile.getFileUrl()); - response.setUrlMd5(ossFile.getUrlMd5()); - response.setFileKey(ossFile.getFileUuid()); - - return response; + return setResponse(ossFile); } /** @@ -194,18 +143,68 @@ public class FileServiceImpl implements FileService { // 文件大小超出上限 int size = Utility .capacityConversion(fileUploadConfig.getStorageSize(), fileUploadConfig.getStorageUnit()); - BizException.error(fileLength > size, CodeEnum.FILE_SIZE_EXCEEDS_LIMIT); + BizException.error(size > fileLength, CodeEnum.FILE_SIZE_EXCEEDS_LIMIT); // 文件格式判断 String[] formats = fileUploadConfig.getFileFormat().split(CommonConstants.COMMA); int lastIndexOf = fileName.lastIndexOf(CommonConstants.DOT); - BizException.error(lastIndexOf == CommonConstants.NOT_FOUND_INDEX_OF, CodeEnum.NOT_FILE_FORMAT); + BizException + .error(lastIndexOf != CommonConstants.NOT_FOUND_INDEX_OF, CodeEnum.NOT_FILE_FORMAT); // 是否包含指定格式 String fileFormat = fileName.substring(lastIndexOf + CommonConstants.ONE).toLowerCase(); boolean contains = Arrays.asList(formats).contains(fileFormat); - BizException.error(!contains, CodeEnum.FILE_FORMAT_NOT_SUPPORTED); + BizException.error(contains, CodeEnum.FILE_FORMAT_NOT_SUPPORTED); return fileFormat; } + + private File generateFile(FileUploadConfig fileUploadConfig, ServerFileUploadDto dto) { + // 判断容量 + String fileConform = isFileConform(fileUploadConfig, dto.getFileContent().length, + dto.getFileName()); + + String uuid = Utility.getUUID(); + + // 生成上传文件的唯一key + String tgtFileKey = Utility.generateFileKey(fileUploadConfig.getDirectory(), uuid, fileConform); + + File ossFile = new File(); + ossFile.setAppChannelBucketNo(fileUploadConfig.getAppChannelBucketNo()); + ossFile.setAppCode(fileUploadConfig.getAppCode()); + ossFile.setChannelCode(fileUploadConfig.getChannelCode()); + ossFile.setBucketName(fileUploadConfig.getBucketName()); + ossFile.setDirectory(fileUploadConfig.getDirectory()); + ossFile.setStatus(FileStatusEnum.STATUS_UPLOAD_FAIL.getCode()); + ossFile.setStorageUnit(fileUploadConfig.getStorageUnit()); + ossFile.setStorageSize(fileUploadConfig.getStorageSize()); + ossFile.setFileFormat(fileConform); + // 上传文件 + String fileUrl = fileManager.uploadByStream( + fileUploadConfig.getBucketName(), tgtFileKey, dto.getFileContent()); + + // 保存失败 + if (Utility.isBlank(fileUrl)) { + fileDao.save(ossFile); + throw new BizException(CodeEnum.FILE_UPLOAD_FAILED); + } + + ossFile.setFileUuid(uuid); + ossFile.setFileUrl(fileUrl); + ossFile.setUrlMd5(Utility.getMd5(fileUrl)); + ossFile.setStatus(FileStatusEnum.STATUS_UPLOAD_SUCCESS.getCode()); + ossFile.setFileName(dto.getFileName()); + ossFile.setFileMd5(Utility.getMd5(dto.getFileContent())); + fileDao.save(ossFile); + return ossFile; + } + + private ServerFileUploadResponse setResponse(File ossFile){ + ServerFileUploadResponse response = new ServerFileUploadResponse(); + response.setUrl(ossFile.getFileUrl()); + response.setUrlMd5(ossFile.getUrlMd5()); + response.setFileKey(ossFile.getFileUuid()); + return response; + } + } diff --git a/oss-test/src/test/java/cn/axzo/oss/test/FileServiceTest.java b/oss-test/src/test/java/cn/axzo/oss/test/FileServiceTest.java index b51677a..1b52bdb 100644 --- a/oss-test/src/test/java/cn/axzo/oss/test/FileServiceTest.java +++ b/oss-test/src/test/java/cn/axzo/oss/test/FileServiceTest.java @@ -4,12 +4,10 @@ import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; import cn.axzo.oss.manager.api.dto.request.ServerFileUploadDto; import cn.axzo.oss.service.api.FileService; import cn.axzo.oss.test.base.SpringTestBase; -import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; -import java.util.ArrayList; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -38,9 +36,9 @@ public class FileServiceTest extends SpringTestBase { ServerFileUploadDto dto = new ServerFileUploadDto(); dto.setAppCode("test"); dto.setBizScene("1"); - dto.setFileName("一个新的文件.jpg"); + dto.setFileName("一个新的文件.xlsx"); - File file = new File("/Users/zhangran/Desktop/xx/IMG_20210728_162815.jpg"); + File file = new File("/Users/admin/Downloads/表扬人员名称.xlsx"); FileInputStream fileInputStream = null; @@ -53,9 +51,10 @@ public class FileServiceTest extends SpringTestBase { } catch (IOException e) { e.printStackTrace(); } +// System.out.println(Arrays.toString(bytes)); dto.setFileContent(bytes); - - fileService.upload(dto); +// +// fileService.upload(dto); } From 612a80aadd702b478fb7ff5d5ebd4d17d5328d9e Mon Sep 17 00:00:00 2001 From: zhangran Date: Thu, 5 Aug 2021 22:12:54 +0800 Subject: [PATCH 29/31] =?UTF-8?q?fix-=E6=8F=90=E5=87=BA=E9=83=A8=E5=88=86?= =?UTF-8?q?=E5=B8=B8=E9=87=8F=EF=BC=8C=E4=BC=98=E5=8C=96sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/sql/ddl/oss_data_init.sql | 14 ---------- doc/sql/dml/oss_data_init.sql | 14 ++++++++++ .../oss/common/constans/CommonConstants.java | 15 ----------- .../axzo/oss/common/enums/FileClassEnum.java | 27 +++++++++++++++++++ .../cn/axzo/oss/common/utils/Utility.java | 7 +++-- .../oss/service/impl/FileServiceImpl.java | 5 ++-- 6 files changed, 47 insertions(+), 35 deletions(-) delete mode 100644 doc/sql/ddl/oss_data_init.sql create mode 100644 doc/sql/dml/oss_data_init.sql create mode 100644 oss-common/src/main/java/cn/axzo/oss/common/enums/FileClassEnum.java diff --git a/doc/sql/ddl/oss_data_init.sql b/doc/sql/ddl/oss_data_init.sql deleted file mode 100644 index 2c7ca50..0000000 --- a/doc/sql/ddl/oss_data_init.sql +++ /dev/null @@ -1,14 +0,0 @@ -INSERT INTO `app_channel_bucket`( `app_channel_bucket_no`, `app_code`, `channel_code`, `bucket_name`, `access_control`, `remark`, `extension`, `create_at`, `update_at`, `create_by`, `update_by`, `is_delete`) -VALUES ( 'zeus:aliyun:zeus', 'zeus', 'aliyun', 'axzo_public', '', NULL, NULL, now(), now(), '', '', 0); - -INSERT INTO `file_app`(`app_code`, `app_name`, `status`, `remark`, `extension`, `create_at`, `update_at`, `create_by`, `update_by`, `is_delete`) -VALUES ('zeus', 'zeus', 1, 'zeus', NULL, now(), now(), '', '', 0); - -INSERT INTO `file_business_scene`(`app_channel_bucket_no`, `app_code`, `channel_code`, `bucket_name`, `business_scene`, `directory`, `create_at`, `update_at`, `create_by`, `update_by`, `is_delete`) -VALUES ('zeus:aliyun:zeus', 'zeus', 'aliyun', 'axzo_public', 'recruit_collect', 'oss-test/zeus', now(), now(), NULL, NULL, 0); - -INSERT INTO `file_channel`(`channel_code`, `channel_name`, `status`, `remark`, `extension`, `priority`, `create_at`, `update_at`, `create_by`, `update_by`, `is_delete`) -VALUES ('aliyun', '阿里云', 1, NULL, NULL, 1, now(), now(), NULL, NULL, 0); - -INSERT INTO `file_upload_config`(`app_channel_bucket_no`, `app_code`, `channel_code`, `bucket_name`, `directory`, `storage_unit`, `storage_size`, `file_format`, `create_at`, `update_at`, `create_by`, `update_by`, `is_delete`) -VALUES ('zeus:aliyun:zeus', 'zeus', 'aliyun', 'axzo-public', 'oss-test/zeus', 'MB', 5, 'jpg', now(), now(), NULL, NULL, 0); \ No newline at end of file diff --git a/doc/sql/dml/oss_data_init.sql b/doc/sql/dml/oss_data_init.sql new file mode 100644 index 0000000..0aa8384 --- /dev/null +++ b/doc/sql/dml/oss_data_init.sql @@ -0,0 +1,14 @@ +INSERT INTO `app_channel_bucket`( `app_channel_bucket_no`, `app_code`, `channel_code`, `bucket_name`) +VALUES ( 'zeus:aliyun:zeus', 'zeus', 'aliyun', 'axzo_public'); + +INSERT INTO `file_app`(`app_code`, `app_name`, `status`, `remark` ) +VALUES ('zeus', 'zeus', 1, 'zeus'); + +INSERT INTO `file_business_scene`(`app_channel_bucket_no`, `app_code`, `channel_code`, `bucket_name`, `business_scene`, `directory`) +VALUES ('zeus:aliyun:zeus', 'zeus', 'aliyun', 'axzo_public', 'recruit_collect', 'oss-test/zeus'); + +INSERT INTO `file_channel`(`channel_code`, `channel_name`, `status`, `priority`) +VALUES ('aliyun', '阿里云', 1, 1); + +INSERT INTO `file_upload_config`(`app_channel_bucket_no`, `app_code`, `channel_code`, `bucket_name`, `directory`, `storage_unit`, `storage_size`, `file_format`) +VALUES ('zeus:aliyun:zeus', 'zeus', 'aliyun', 'axzo-public', 'oss-test/zeus', 'MB', 5, 'xlsx'); \ No newline at end of file diff --git a/oss-common/src/main/java/cn/axzo/oss/common/constans/CommonConstants.java b/oss-common/src/main/java/cn/axzo/oss/common/constans/CommonConstants.java index ea54966..a8e2922 100644 --- a/oss-common/src/main/java/cn/axzo/oss/common/constans/CommonConstants.java +++ b/oss-common/src/main/java/cn/axzo/oss/common/constans/CommonConstants.java @@ -9,21 +9,6 @@ package cn.axzo.oss.common.constans; */ public abstract class CommonConstants { - /** - * 默认 分割器 - */ - public static final String SEPARATOR_CHAR = "/"; - - /** - * 默认 . - */ - public static final String DOT = "."; - - /** - * 逗号 - */ - public static final String COMMA = ","; - /** * 在指定字符串未找字符串的位置 */ diff --git a/oss-common/src/main/java/cn/axzo/oss/common/enums/FileClassEnum.java b/oss-common/src/main/java/cn/axzo/oss/common/enums/FileClassEnum.java new file mode 100644 index 0000000..6aa37e9 --- /dev/null +++ b/oss-common/src/main/java/cn/axzo/oss/common/enums/FileClassEnum.java @@ -0,0 +1,27 @@ +package cn.axzo.oss.common.enums; + +/** + * @author: zhangran + * @date: 20210805 21:31 + * @description: 文件类符号 + **/ +public enum FileClassEnum { + + + SEPARATOR_CHAR("/", "默认 分割器"), + DOT(".", "文件命后缀 如abc.xlsx"), + COMMA(",", "逗号"), + ; + + + FileClassEnum(String type, String desc) { + this.type = type; + this.desc = desc; + } + + + public final String type; + + public final String desc; + +} diff --git a/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java b/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java index 0ac709a..db15d6c 100644 --- a/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java +++ b/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java @@ -1,8 +1,7 @@ package cn.axzo.oss.common.utils; -import cn.axzo.oss.common.constans.CommonConstants; +import cn.axzo.oss.common.enums.FileClassEnum; import cn.axzo.oss.common.enums.StorageUnitEnum; -import java.io.File; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; @@ -120,9 +119,9 @@ public class Utility { */ public static String generateFileKey(String directory, String fileUuid, String fileFormat){ StringBuilder tgtFileKey = new StringBuilder(directory); - tgtFileKey.append(CommonConstants.SEPARATOR_CHAR); + tgtFileKey.append(FileClassEnum.SEPARATOR_CHAR.type); tgtFileKey.append(fileUuid); - tgtFileKey.append(CommonConstants.DOT); + tgtFileKey.append(FileClassEnum.DOT.type); tgtFileKey.append(fileFormat); return tgtFileKey.toString(); } diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java index f728321..2b3f1e3 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java @@ -4,6 +4,7 @@ import cn.axzo.oss.common.constans.CommonConstants; import cn.axzo.oss.common.constans.CommonConstants.FileStatus; import cn.axzo.oss.common.constans.CommonConstants.TableDelete; import cn.axzo.oss.common.enums.CodeEnum; +import cn.axzo.oss.common.enums.FileClassEnum; import cn.axzo.oss.common.enums.FileStatusEnum; import cn.axzo.oss.common.exception.BizException; import cn.axzo.oss.common.utils.JsonUtil; @@ -145,9 +146,9 @@ public class FileServiceImpl implements FileService { .capacityConversion(fileUploadConfig.getStorageSize(), fileUploadConfig.getStorageUnit()); BizException.error(size > fileLength, CodeEnum.FILE_SIZE_EXCEEDS_LIMIT); // 文件格式判断 - String[] formats = fileUploadConfig.getFileFormat().split(CommonConstants.COMMA); + String[] formats = fileUploadConfig.getFileFormat().split(FileClassEnum.COMMA.type); - int lastIndexOf = fileName.lastIndexOf(CommonConstants.DOT); + int lastIndexOf = fileName.lastIndexOf(FileClassEnum.DOT.type); BizException .error(lastIndexOf != CommonConstants.NOT_FOUND_INDEX_OF, CodeEnum.NOT_FILE_FORMAT); From 45178f8fd5b751cd811414a3447167ac8edb6d05 Mon Sep 17 00:00:00 2001 From: zhangran Date: Thu, 5 Aug 2021 22:14:01 +0800 Subject: [PATCH 30/31] =?UTF-8?q?fix-=E5=88=A0=E9=99=A4=E6=97=A0=E6=95=88?= =?UTF-8?q?=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/oss/service/impl/FileServiceImpl.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java index 2b3f1e3..f290b25 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java @@ -13,23 +13,18 @@ import cn.axzo.oss.dal.entity.AppChannelBucket; import cn.axzo.oss.dal.entity.File; import cn.axzo.oss.dal.entity.FileApp; import cn.axzo.oss.dal.entity.FileBusinessScene; -import cn.axzo.oss.dal.entity.FileChannel; import cn.axzo.oss.dal.entity.FileUploadConfig; import cn.axzo.oss.dal.repository.FileAppDao; import cn.axzo.oss.dal.repository.FileDao; import cn.axzo.oss.manager.api.AppChannelBucketManager; import cn.axzo.oss.manager.api.FileBusinessSceneManager; -import cn.axzo.oss.manager.api.FileChannelManager; import cn.axzo.oss.manager.api.FileManager; import cn.axzo.oss.manager.api.FileUploadConfigManager; import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; import cn.axzo.oss.manager.api.dto.request.ServerFileUploadDto; import cn.axzo.oss.manager.api.dto.response.ServerFileUploadResponse; import cn.axzo.oss.service.api.FileService; -import com.google.common.collect.Lists; -import java.util.ArrayList; import java.util.Arrays; -import java.util.List; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -55,8 +50,6 @@ public class FileServiceImpl implements FileService { @Autowired private AppChannelBucketManager appChannelBucketManager; @Autowired - private FileChannelManager fileChannelManager; - @Autowired private FileBusinessSceneManager fileBusinessSceneManager; @Autowired private FileUploadConfigManager fileUploadConfigManager; From 995fbc4e5ae39684783a56dd362556f5e430b2a5 Mon Sep 17 00:00:00 2001 From: zhangran Date: Thu, 12 Aug 2021 14:10:43 +0800 Subject: [PATCH 31/31] =?UTF-8?q?fix-=E4=BF=AE=E6=94=B9sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/sql/dml/oss_data_init.sql | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/sql/dml/oss_data_init.sql b/doc/sql/dml/oss_data_init.sql index 0aa8384..19c5b41 100644 --- a/doc/sql/dml/oss_data_init.sql +++ b/doc/sql/dml/oss_data_init.sql @@ -1,14 +1,14 @@ INSERT INTO `app_channel_bucket`( `app_channel_bucket_no`, `app_code`, `channel_code`, `bucket_name`) -VALUES ( 'zeus:aliyun:zeus', 'zeus', 'aliyun', 'axzo_public'); +VALUES ( 'zeus:aliyun:zeus', 'zeus', 'aliyun', 'axzo-oss'); INSERT INTO `file_app`(`app_code`, `app_name`, `status`, `remark` ) VALUES ('zeus', 'zeus', 1, 'zeus'); INSERT INTO `file_business_scene`(`app_channel_bucket_no`, `app_code`, `channel_code`, `bucket_name`, `business_scene`, `directory`) -VALUES ('zeus:aliyun:zeus', 'zeus', 'aliyun', 'axzo_public', 'recruit_collect', 'oss-test/zeus'); +VALUES ('zeus:aliyun:zeus', 'zeus', 'aliyun', 'axzo-oss', 'recruit_collect', 'zeus/recruit_collect'); INSERT INTO `file_channel`(`channel_code`, `channel_name`, `status`, `priority`) VALUES ('aliyun', '阿里云', 1, 1); INSERT INTO `file_upload_config`(`app_channel_bucket_no`, `app_code`, `channel_code`, `bucket_name`, `directory`, `storage_unit`, `storage_size`, `file_format`) -VALUES ('zeus:aliyun:zeus', 'zeus', 'aliyun', 'axzo-public', 'oss-test/zeus', 'MB', 5, 'xlsx'); \ No newline at end of file +VALUES ('zeus:aliyun:zeus', 'zeus', 'aliyun', 'axzo-oss', 'zeus/recruit_collect', 'MB', 5, 'xlsx'); \ No newline at end of file