From b0a374c800f856ceb26ff58275a0fc7919bdfd5e Mon Sep 17 00:00:00 2001 From: tianliyong Date: Mon, 28 Nov 2022 19:51:09 +0800 Subject: [PATCH 01/15] =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E5=AF=B9=E6=8E=A5=E6=93=8D=E4=BD=9C=E6=97=A5=E5=BF=97=E8=AE=B0?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/oss/client/Bootstrap.java | 2 + .../controller/ServerFileController.java | 16 +++++- .../client/controller/WebFileController.java | 50 ++++++++++++------- oss-service-api/pom.xml | 4 ++ .../cn/axzo/oss/service/api/FileService.java | 5 +- .../oss/service/impl/FileServiceImpl.java | 49 +++++++++++++++++- pom.xml | 6 +++ 7 files changed, 108 insertions(+), 24 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 d82dbe1..3776998 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 @@ -4,6 +4,7 @@ import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.openfeign.EnableFeignClients; /** * OSS 启动类 @@ -14,6 +15,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; */ @Slf4j @MapperScan(basePackages = {"cn.axzo.oss.dal.mapper"}) +@EnableFeignClients(basePackages = {"cn.axzo.log.platform.client"}) @SpringBootApplication(scanBasePackages = {"cn.axzo.oss"}) public class Bootstrap { 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 0be984e..0933f33 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,6 +1,7 @@ package cn.axzo.oss.client.controller; import cn.axzo.core.utils.converter.BeanConverter; +import cn.axzo.framework.auth.domain.ContextInfo; import cn.axzo.oss.common.utils.BeanConvertUtil; import cn.axzo.oss.http.api.ServerFileServiceApi; import cn.axzo.oss.http.model.*; @@ -10,10 +11,12 @@ 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 cn.hutool.json.JSONUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; +import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import java.util.List; @@ -30,18 +33,27 @@ public class ServerFileController implements ServerFileServiceApi { @Autowired private FileService fileService; + @Autowired + private HttpServletRequest httpServletRequest; + @Override public CommonResponse upload(@Valid @RequestBody ServerFileUploadRequest request) { ServerFileUploadDto dto = BeanConvertUtil.copyBean(request, ServerFileUploadDto.class); request.setFileContent(null); - return CommonResponse.success(BeanConverter.convert(fileService.upload(dto), ServerFileUploadResponse.class)); + // 获取feign调用请求头携带的用户信息 + String contextInfoLiteJsonStr = httpServletRequest.getHeader("X-CONTEXT-INFO-LITE"); + ContextInfo.LiteSaasContext liteSaasContext = JSONUtil.toBean(contextInfoLiteJsonStr, ContextInfo.LiteSaasContext.class); + return CommonResponse.success(BeanConverter.convert(fileService.upload(dto, liteSaasContext), ServerFileUploadResponse.class)); } @Override public CommonResponse uploadV2(ServerFileUploadRequest request) { ServerFileUploadDto dto = BeanConvertUtil.copyBean(request, ServerFileUploadDto.class); request.setFileContent(null); - return CommonResponse.success(BeanConverter.convert(fileService.uploadV2(dto), FileInformationResponse.class)); + // 获取feign调用请求头携带的用户信息 + String contextInfoLiteJsonStr = httpServletRequest.getHeader("X-CONTEXT-INFO-LITE"); + ContextInfo.LiteSaasContext liteSaasContext = JSONUtil.toBean(contextInfoLiteJsonStr, ContextInfo.LiteSaasContext.class); + return CommonResponse.success(BeanConverter.convert(fileService.uploadV2(dto, liteSaasContext), FileInformationResponse.class)); } /** diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java index e8531e4..07a51e9 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java @@ -1,6 +1,8 @@ package cn.axzo.oss.client.controller; import cn.axzo.core.utils.converter.BeanConverter; +import cn.axzo.framework.auth.domain.ContextInfo; +import cn.axzo.framework.auth.domain.ContextInfoHolder; import cn.axzo.oss.client.vo.FileInformationVo; import cn.axzo.oss.client.vo.FindFileUrlVo; import cn.axzo.oss.client.vo.WebFileUploadVo; @@ -38,17 +40,46 @@ public class WebFileController { public CommonResponse upload(@Valid @RequestParam String appCode, @Valid @RequestParam String bizScene, @Valid @RequestParam MultipartFile file) { + //获取用户信息 + ContextInfo.LiteSaasContext liteSaasContext = null; + ContextInfo contextInfo = ContextInfoHolder.get(); + if (contextInfo != null) { + liteSaasContext = contextInfo.lite(); + } ServerFileUploadDto fileUploadDto = ServerFileUploadDto.builder() .appCode(appCode) .bizScene(bizScene) .fileName(file.getOriginalFilename()) .fileContent(file.getBytes()) .build(); - ServerFileUploadResponse response = fileService.upload(fileUploadDto); + ServerFileUploadResponse response = fileService.upload(fileUploadDto, liteSaasContext); WebFileUploadVo result = BeanConvertUtil.copyBean(response, WebFileUploadVo.class); return CommonResponse.success(result); } + @PostMapping("/v2/file") + @CrossOrigin + @SneakyThrows + public CommonResponse uploadV2(@Valid @RequestParam String appCode, + @Valid @RequestParam String bizScene, + @Valid @RequestParam MultipartFile file) { + //获取用户信息 + ContextInfo.LiteSaasContext liteSaasContext = null; + ContextInfo contextInfo = ContextInfoHolder.get(); + if (contextInfo != null) { + liteSaasContext = contextInfo.lite(); + } + ServerFileUploadDto fileUploadDto = ServerFileUploadDto.builder() + .appCode(appCode) + .bizScene(bizScene) + .fileName(file.getOriginalFilename()) + .fileContent(file.getBytes()) + .build(); + FileInformationResponse response = fileService.uploadV2(fileUploadDto, liteSaasContext); + FileInformationVo result = BeanConvertUtil.copyBean(response, FileInformationVo.class); + return CommonResponse.success(result); + } + @SneakyThrows @PostMapping("/v1/file/getUrl") @CrossOrigin @@ -61,21 +92,4 @@ public class WebFileController { List response = fileService.findFileUrl(dto); return CommonResponse.success(BeanConverter.convert(response, FindFileUrlVo.class)); } - - @PostMapping("/v2/file") - @CrossOrigin - @SneakyThrows - public CommonResponse uploadV2(@Valid @RequestParam String appCode, - @Valid @RequestParam String bizScene, - @Valid @RequestParam MultipartFile file) { - ServerFileUploadDto fileUploadDto = ServerFileUploadDto.builder() - .appCode(appCode) - .bizScene(bizScene) - .fileName(file.getOriginalFilename()) - .fileContent(file.getBytes()) - .build(); - FileInformationResponse response = fileService.uploadV2(fileUploadDto); - FileInformationVo result = BeanConvertUtil.copyBean(response, FileInformationVo.class); - return CommonResponse.success(result); - } } diff --git a/oss-service-api/pom.xml b/oss-service-api/pom.xml index a69251c..b90326c 100644 --- a/oss-service-api/pom.xml +++ b/oss-service-api/pom.xml @@ -22,6 +22,10 @@ cn.axzo.oss oss-manager-api + + cn.axzo.platform + axzo-log-api + 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 8de549d..eb5d8f9 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,5 +1,6 @@ package cn.axzo.oss.service.api; +import cn.axzo.framework.auth.domain.ContextInfo; import cn.axzo.oss.manager.api.dto.request.FindFileKeyDto; import cn.axzo.oss.manager.api.dto.request.FindFileUrlDto; import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; @@ -31,11 +32,11 @@ public interface FileService { * * @param request */ - ServerFileUploadResponse upload(ServerFileUploadDto request); + ServerFileUploadResponse upload(ServerFileUploadDto request, ContextInfo.LiteSaasContext liteSaasContext); List findFileUrl(FindFileUrlDto dto); List findFileKey(FindFileKeyDto dto); - FileInformationResponse uploadV2(ServerFileUploadDto request); + FileInformationResponse uploadV2(ServerFileUploadDto request, ContextInfo.LiteSaasContext liteSaasContext); } 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 3b016dd..66ba8f1 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,10 @@ package cn.axzo.oss.service.impl; +import cn.axzo.framework.auth.domain.ContextInfo; +import cn.axzo.framework.auth.domain.ContextInfoHolder; +import cn.axzo.framework.auth.domain.UserInfo; +import cn.axzo.log.platform.client.LogPlatClient; +import cn.axzo.log.platform.client.model.OperateLogReq; import cn.axzo.oss.common.constans.CommonConstants; import cn.axzo.oss.common.constans.CommonConstants.FileStatus; import cn.axzo.oss.common.constans.CommonConstants.TableDelete; @@ -25,13 +30,17 @@ import cn.axzo.oss.manager.api.dto.response.FindFileKeyResponse; import cn.axzo.oss.manager.api.dto.response.FindFileUrlResponse; import cn.axzo.oss.manager.api.dto.response.ServerFileUploadResponse; import cn.axzo.oss.service.api.FileService; +import cn.azxo.framework.common.utils.LogUtil; import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Arrays; +import java.util.Date; import java.util.List; import java.util.stream.Collectors; @@ -60,6 +69,12 @@ public class FileServiceImpl implements FileService { @Autowired private FileUploadConfigManager fileUploadConfigManager; + @Autowired + private Environment environment; + + + @Autowired + private LogPlatClient logPlatClient; /** * 删除文件 @@ -113,17 +128,47 @@ public class FileServiceImpl implements FileService { * @param dto */ @Override - public ServerFileUploadResponse upload(ServerFileUploadDto dto) { + public ServerFileUploadResponse upload(ServerFileUploadDto dto, ContextInfo.LiteSaasContext liteSaasContext) { File ossFile = uploadFileAndGetFile(dto); + //操作日志记录 + operateLog(JSON.toJSONString(dto), liteSaasContext); return setResponse(ossFile); } @Override - public FileInformationResponse uploadV2(ServerFileUploadDto request) { + public FileInformationResponse uploadV2(ServerFileUploadDto request, ContextInfo.LiteSaasContext liteSaasContext) { File ossFile = uploadFileAndGetFile(request); + //操作日志记录 + operateLog(JSON.toJSONString(request), liteSaasContext); return setFileInfoResp(ossFile); } + /** + * 操作日志记录 + */ + private void operateLog(String param, ContextInfo.LiteSaasContext liteSaasContext) { + if (liteSaasContext == null || liteSaasContext.getIdentityId() == null || liteSaasContext.getIdentityType() == null) { + log.warn("获取用户上下文信息失败"); + return; + } + //记录日志 + try { + OperateLogReq log = OperateLogReq.builder() + .serviceName(environment.getProperty("spring.application.name")) + .featureName("oss文件上传") + .operateTime(new Date()) + .identityId(liteSaasContext.getIdentityId()) + .identityType(liteSaasContext.getIdentityType()) + .operateParam(param) + .workspaceId(liteSaasContext.getWorkspaceId()) + .operateType(1) + .build(); + logPlatClient.createOperateLog(log); + } catch (Exception e) { + log.warn("服务间调用异常-发送日志失败: errMsg={}.", e.getMessage()); + } + } + private File uploadFileAndGetFile(ServerFileUploadDto dto) { log.info("update fileName:{},appCode:{},bizScene:{}", dto.getFileName(), dto.getAppCode(), dto.getBizScene()); diff --git a/pom.xml b/pom.xml index 69dfc62..97760d7 100644 --- a/pom.xml +++ b/pom.xml @@ -20,6 +20,7 @@ 2.0.0-SNAPSHOT 2.0.0-SNAPSHOT 3.10.2 + 1.0.0-SNAPSHOT @@ -95,6 +96,11 @@ aliyun-sdk-oss ${aliyun-oss.version} + + cn.axzo.platform + axzo-log-api + ${axzo-log-api.version} + From 3b879e183c28469f449252714637501186854977 Mon Sep 17 00:00:00 2001 From: tianliyong Date: Tue, 29 Nov 2022 18:28:18 +0800 Subject: [PATCH 02/15] =?UTF-8?q?add=20web=E6=8E=A5=E5=8F=A3=E9=80=9A?= =?UTF-8?q?=E8=BF=87fileKey=E8=BF=94=E5=9B=9E=E6=96=87=E4=BB=B6=E6=B5=81?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/controller/WebFileController.java | 32 ++++ .../cn/axzo/oss/dal/repository/FileDao.java | 2 + .../oss/dal/repository/impl/FileDaoImpl.java | 7 + .../integration/s3/base/BaseS3Service.java | 7 +- .../s3/impl/AliOssServiceImpl.java | 148 +++++++++--------- .../cn/axzo/oss/manager/api/FileManager.java | 43 +++-- .../dto/request/ServerFileDownloadDto.java | 28 ++++ .../response/ServerFileDownloadResponse.java | 48 ++++++ .../oss/manager/impl/FileManagerImpl.java | 51 +++--- .../cn/axzo/oss/service/api/FileService.java | 12 +- .../oss/service/impl/FileServiceImpl.java | 72 ++++++--- 11 files changed, 308 insertions(+), 142 deletions(-) create mode 100644 oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileDownloadDto.java create mode 100644 oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/response/ServerFileDownloadResponse.java diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java index 07a51e9..72c9aa4 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java @@ -8,18 +8,24 @@ import cn.axzo.oss.client.vo.FindFileUrlVo; import cn.axzo.oss.client.vo.WebFileUploadVo; import cn.axzo.oss.common.utils.BeanConvertUtil; import cn.axzo.oss.manager.api.dto.request.FindFileUrlDto; +import cn.axzo.oss.manager.api.dto.request.ServerFileDownloadDto; import cn.axzo.oss.manager.api.dto.request.ServerFileUploadDto; import cn.axzo.oss.manager.api.dto.response.FileInformationResponse; import cn.axzo.oss.manager.api.dto.response.FindFileUrlResponse; +import cn.axzo.oss.manager.api.dto.response.ServerFileDownloadResponse; import cn.axzo.oss.manager.api.dto.response.ServerFileUploadResponse; import cn.axzo.oss.service.api.FileService; import cn.azxo.framework.common.model.CommonResponse; import lombok.SneakyThrows; +import org.apache.commons.io.IOUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; +import java.io.InputStream; +import java.io.OutputStream; import java.util.List; /** @@ -92,4 +98,30 @@ public class WebFileController { List response = fileService.findFileUrl(dto); return CommonResponse.success(BeanConverter.convert(response, FindFileUrlVo.class)); } + + @SneakyThrows + @PostMapping("/v1/file/download") + @CrossOrigin + public void download(@Valid @RequestParam String appCode, + @Valid @RequestParam String fileKey, + HttpServletResponse response) { + ServerFileDownloadDto dto = ServerFileDownloadDto.builder() + .appCode(appCode) + .fileKey(fileKey) + .build(); + ServerFileDownloadResponse result = fileService.download(dto); + InputStream inputStream = null; + OutputStream outputStream = response.getOutputStream(); + try { + inputStream = result.getFileStream(); + response.setContentType("application/x-download"); + response.addHeader("Content-Disposition", "attachment;filename=" + result.getFileKey() + "." + result.getFileFormat()); + IOUtils.copy(inputStream, outputStream); + } catch (Exception e) { + e.printStackTrace(); + } finally { + inputStream.close(); + outputStream.close(); + } + } } 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 1097aa5..c191678 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 @@ -23,6 +23,8 @@ public interface FileDao extends IService { */ File getByAppCodeAndUrlMd5(String appCode, String urlMd5); + File getByAppCodeAndFileUuid(String appCode, String fileKey); + List getByAppCodeAndFileUuids(String appCode, List fileKey); List getByAppCodeAndUrlMd5s(String appCode, List urlMd5List); 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 91b086f..8c85f47 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 @@ -28,6 +28,13 @@ public class FileDaoImpl extends ServiceImpl implements FileDa .last("limit 1").one(); } + @Override + public File getByAppCodeAndFileUuid(String appCode, String fileKey) { + return lambdaQuery().eq(File::getAppCode, appCode).eq(File::getFileUuid, fileKey) + .eq(File::getStatus, FileStatus.SUCCESS).eq(File::getIsDelete, TableDelete.UN_DELETED) + .last("limit 1").one(); + } + @Override public List getByAppCodeAndFileUuids(String appCode, List fileKey) { return lambdaQuery().eq(File::getAppCode, 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 index 06639bf..0777de0 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,9 +1,10 @@ package cn.axzo.oss.integration.s3.base; +import org.springframework.http.ResponseEntity; +import org.springframework.web.multipart.MultipartFile; + import java.io.FilterInputStream; import java.io.InputStream; -import org.springframework.http.ResponseEntity; -import org.springframework.web.multipart.MultipartFile; /** * @Author admin @@ -38,6 +39,8 @@ public interface BaseS3Service { */ ResponseEntity download(String tgtFileKey); + InputStream downloadFile(String bucket, String tgtFileKey); + /** * get file address * 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 c6e7737..a2e2297 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 @@ -6,6 +6,7 @@ import cn.azxo.framework.common.utils.LogUtil; import com.aliyun.oss.ClientException; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSException; +import com.aliyun.oss.model.OSSObject; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; @@ -25,81 +26,88 @@ import java.io.InputStream; @Slf4j public class AliOssServiceImpl implements AliOssService { - @Autowired - private AliOssClient aliOssClient; + @Autowired + private AliOssClient aliOssClient; - /** - * upload file - */ - @Override - public String uploadByStream(String bucketName, String tgtFileKey, InputStream srcStream) { - OSS client = aliOssClient.getClient(); - try { - client.putObject(bucketName, tgtFileKey, srcStream); - } catch (OSSException e) { - LogUtil.error("uploadByStream OSSException", e); - return ""; - } catch (ClientException e) { - LogUtil.error("uploadByStream ClientException", e); - return ""; + /** + * upload file + */ + @Override + public String uploadByStream(String bucketName, String tgtFileKey, InputStream srcStream) { + OSS client = aliOssClient.getClient(); + try { + client.putObject(bucketName, tgtFileKey, srcStream); + } catch (OSSException e) { + LogUtil.error("uploadByStream OSSException", e); + return ""; + } catch (ClientException e) { + LogUtil.error("uploadByStream ClientException", e); + return ""; + } + + StringBuilder allBuilder = new StringBuilder(); + allBuilder.append("https://"); + allBuilder.append(bucketName); + allBuilder.append("."); + allBuilder.append(aliOssClient.getEndpoint()); + allBuilder.append(tgtFileKey); + + return allBuilder.toString(); } - StringBuilder allBuilder = new StringBuilder(); - allBuilder.append("https://"); - allBuilder.append(bucketName); - allBuilder.append("."); - allBuilder.append(aliOssClient.getEndpoint()); - allBuilder.append(tgtFileKey); - - return allBuilder.toString(); - } - - /** - * 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) { - LogUtil.error("ali oss delFile error = {}", e); + /** + * upload multi file + */ + @Override + public boolean uploadMultiFile(MultipartFile[] multipartFiles) { + return false; } - return Boolean.FALSE; - } - /** - * download file - */ - @Override - public ResponseEntity download(String tgtFileKey) { - return null; - } + /** + * 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) { + LogUtil.error("ali oss delFile error = {}", e); + } + return Boolean.FALSE; + } - /** - * get file address - * - * @param ttl second - */ - @Override - public String getFileAddress(String tgtFileKey, int ttl) { - return null; - } + /** + * download file + */ + @Override + public ResponseEntity download(String tgtFileKey) { + return null; + } - /** - * get S3Object stream - */ - @Override - public FilterInputStream getS3ObjectStream(String tgtFileKey) { - return null; - } + @Override + public InputStream downloadFile(String bucket, String tgtFileKey) { + OSS client = aliOssClient.getClient(); + OSSObject ossObject = client.getObject(bucket, tgtFileKey); + return ossObject.getObjectContent(); + } + + /** + * 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 b5355ea..e8a1fe7 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,5 +1,7 @@ package cn.axzo.oss.manager.api; +import java.io.InputStream; + /** * @Author admin * @Description @@ -8,22 +10,31 @@ package cn.axzo.oss.manager.api; **/ public interface FileManager { - /** - * 删除文件 - * @param bucketName 桶名称 - * @param tgtFileKey 目标文件key - * @return - */ - boolean delete(String bucketName, String tgtFileKey); + /** + * 删除文件 + * + * @param bucketName 桶名称 + * @param tgtFileKey 目标文件key + * @return + */ + boolean delete(String bucketName, String tgtFileKey); - /** - * 上传 - * - * @param bulkName - * @param keyPath - * @param fileContent - * @return - */ - String uploadByStream(String bulkName, String keyPath, byte[] fileContent); + /** + * 上传 + * + * @param bulkName + * @param keyPath + * @param fileContent + * @return + */ + String uploadByStream(String bulkName, String keyPath, byte[] fileContent); + + /** + * 下载文件 + * + * @param bucketName 桶名称 + * @param tgtFileKey 目标文件key + */ + InputStream downloadFile(String bucketName, String tgtFileKey); } diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileDownloadDto.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileDownloadDto.java new file mode 100644 index 0000000..902f5c8 --- /dev/null +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileDownloadDto.java @@ -0,0 +1,28 @@ +package cn.axzo.oss.manager.api.dto.request; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author: liyong.tian + * @Date: 2022/11/29 15:42 + * @Description: 文件下载 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ServerFileDownloadDto { + + /** + * 应用码 + */ + private String appCode; + + /** + * 文件uuid + */ + private String fileKey; +} diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/response/ServerFileDownloadResponse.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/response/ServerFileDownloadResponse.java new file mode 100644 index 0000000..047bb63 --- /dev/null +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/response/ServerFileDownloadResponse.java @@ -0,0 +1,48 @@ +package cn.axzo.oss.manager.api.dto.response; + +import lombok.Data; + +import java.io.InputStream; + +/** + * @Author: liyong.tian + * @Date: 2022/11/29 17:06 + * @Description: 服务端文件下载响应类 + */ +@Data +public class ServerFileDownloadResponse { + + /** + * 文件 URL + */ + private String url; + /** + * 文件 Key + */ + private String fileKey; + + /** + * URL MD5 + */ + private String urlMd5; + + /** + * 文件名称 + */ + private String fileName; + + /** + * 文件大小 + */ + private Long fileSize; + + /** + * 文件格式 + */ + private String fileFormat; + + /** + * 文件流 + */ + private InputStream fileStream; +} 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 45bf80b..6e3070a 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,12 +2,13 @@ package cn.axzo.oss.manager.impl; import cn.axzo.oss.integration.s3.AliOssService; import cn.axzo.oss.manager.api.FileManager; -import java.io.ByteArrayInputStream; -import java.io.InputStream; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.io.ByteArrayInputStream; +import java.io.InputStream; + /** * @Author admin * @Description @@ -18,29 +19,35 @@ import org.springframework.stereotype.Service; @Slf4j public class FileManagerImpl implements FileManager { - @Autowired - private AliOssService aliOssService; + @Autowired + private AliOssService aliOssService; - /** - * 删除文件 - * @param bucketName 桶名称 - * @param tgtFileKey 目标文件key - * @return - */ - @Override - public boolean delete(String bucketName, String tgtFileKey) { - return aliOssService.delFile(bucketName, tgtFileKey); - } + /** + * 删除文件 + * + * @param bucketName 桶名称 + * @param tgtFileKey 目标文件key + * @return + */ + @Override + public boolean delete(String bucketName, String tgtFileKey) { + return aliOssService.delFile(bucketName, tgtFileKey); + } - /** - * @param bulkName 默认的取值为 - * @param keyPath key的前置路径 - */ - public String uploadByStream(String bulkName, String keyPath, byte[] fileContent) { + /** + * @param bulkName 默认的取值为 + * @param keyPath key的前置路径 + */ + public String uploadByStream(String bulkName, String keyPath, byte[] fileContent) { - InputStream inputStream = new ByteArrayInputStream(fileContent); + InputStream inputStream = new ByteArrayInputStream(fileContent); - return aliOssService.uploadByStream(bulkName, keyPath, inputStream); - } + return aliOssService.uploadByStream(bulkName, keyPath, inputStream); + } + + @Override + public InputStream downloadFile(String bucketName, String tgtFileKey) { + return aliOssService.downloadFile(bucketName, tgtFileKey); + } } 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 eb5d8f9..d15f015 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,14 +1,8 @@ package cn.axzo.oss.service.api; import cn.axzo.framework.auth.domain.ContextInfo; -import cn.axzo.oss.manager.api.dto.request.FindFileKeyDto; -import cn.axzo.oss.manager.api.dto.request.FindFileUrlDto; -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.FileInformationResponse; -import cn.axzo.oss.manager.api.dto.response.FindFileKeyResponse; -import cn.axzo.oss.manager.api.dto.response.FindFileUrlResponse; -import cn.axzo.oss.manager.api.dto.response.ServerFileUploadResponse; +import cn.axzo.oss.manager.api.dto.request.*; +import cn.axzo.oss.manager.api.dto.response.*; import java.util.List; @@ -39,4 +33,6 @@ public interface FileService { List findFileKey(FindFileKeyDto dto); FileInformationResponse uploadV2(ServerFileUploadDto request, ContextInfo.LiteSaasContext liteSaasContext); + + ServerFileDownloadResponse download(ServerFileDownloadDto 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 index 66ba8f1..d6a1402 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,8 +1,6 @@ package cn.axzo.oss.service.impl; import cn.axzo.framework.auth.domain.ContextInfo; -import cn.axzo.framework.auth.domain.ContextInfoHolder; -import cn.axzo.framework.auth.domain.UserInfo; import cn.axzo.log.platform.client.LogPlatClient; import cn.axzo.log.platform.client.model.OperateLogReq; import cn.axzo.oss.common.constans.CommonConstants; @@ -21,16 +19,9 @@ import cn.axzo.oss.manager.api.AppChannelBucketManager; import cn.axzo.oss.manager.api.FileBusinessSceneManager; import cn.axzo.oss.manager.api.FileManager; import cn.axzo.oss.manager.api.FileUploadConfigManager; -import cn.axzo.oss.manager.api.dto.request.FindFileKeyDto; -import cn.axzo.oss.manager.api.dto.request.FindFileUrlDto; -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.FileInformationResponse; -import cn.axzo.oss.manager.api.dto.response.FindFileKeyResponse; -import cn.axzo.oss.manager.api.dto.response.FindFileUrlResponse; -import cn.axzo.oss.manager.api.dto.response.ServerFileUploadResponse; +import cn.axzo.oss.manager.api.dto.request.*; +import cn.axzo.oss.manager.api.dto.response.*; import cn.axzo.oss.service.api.FileService; -import cn.azxo.framework.common.utils.LogUtil; import cn.hutool.core.collection.CollectionUtil; import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; @@ -38,6 +29,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.stereotype.Service; +import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; @@ -54,6 +46,9 @@ import java.util.stream.Collectors; @Slf4j public class FileServiceImpl implements FileService { + private static String FILE_UPLOAD_CODE = "OSS_FILE_UPLOAD"; + private static String FILE_UPLOAD_NAME = "文件上传"; + @Autowired private FileManager fileManager; @@ -72,7 +67,6 @@ public class FileServiceImpl implements FileService { @Autowired private Environment environment; - @Autowired private LogPlatClient logPlatClient; @@ -131,7 +125,7 @@ public class FileServiceImpl implements FileService { public ServerFileUploadResponse upload(ServerFileUploadDto dto, ContextInfo.LiteSaasContext liteSaasContext) { File ossFile = uploadFileAndGetFile(dto); //操作日志记录 - operateLog(JSON.toJSONString(dto), liteSaasContext); + operateLog(JSON.toJSONString(dto), FILE_UPLOAD_CODE, FILE_UPLOAD_NAME, liteSaasContext); return setResponse(ossFile); } @@ -139,14 +133,43 @@ public class FileServiceImpl implements FileService { public FileInformationResponse uploadV2(ServerFileUploadDto request, ContextInfo.LiteSaasContext liteSaasContext) { File ossFile = uploadFileAndGetFile(request); //操作日志记录 - operateLog(JSON.toJSONString(request), liteSaasContext); + operateLog(JSON.toJSONString(request), FILE_UPLOAD_CODE, FILE_UPLOAD_NAME, liteSaasContext); return setFileInfoResp(ossFile); } + @Override + public ServerFileDownloadResponse download(ServerFileDownloadDto dto) { + log.info("file download dto = {}", JsonUtil.obj2Str(dto)); + // 检查app code + checkAppCode(dto.getAppCode()); + + File file = fileDao.getByAppCodeAndFileUuid(dto.getAppCode(), dto.getFileKey()); + if (Utility.objIsNull(file)) { + log.warn("file download is null, fileKey = {}", dto.getFileKey()); + return null; + } + String tgtFileKey = Utility + .generateFileKey(file.getDirectory(), file.getFileUuid(), file.getFileFormat()); + log.info("file download tgtFileKey = {}", tgtFileKey); + InputStream fileStream = fileManager.downloadFile(file.getBucketName(), tgtFileKey); + return setFileDownloadResponse(file, fileStream); + } + + private ServerFileDownloadResponse setFileDownloadResponse(File file, InputStream fileStream) { + ServerFileDownloadResponse resp = new ServerFileDownloadResponse(); + resp.setUrl(file.getFileUrl()); + resp.setFileName(file.getFileName()); + resp.setUrlMd5(file.getUrlMd5()); + resp.setFileKey(file.getFileUuid()); + resp.setFileFormat(file.getFileFormat()); + resp.setFileStream(fileStream); + return resp; + } + /** * 操作日志记录 */ - private void operateLog(String param, ContextInfo.LiteSaasContext liteSaasContext) { + private void operateLog(String param, String featureCode, String featureName, ContextInfo.LiteSaasContext liteSaasContext) { if (liteSaasContext == null || liteSaasContext.getIdentityId() == null || liteSaasContext.getIdentityType() == null) { log.warn("获取用户上下文信息失败"); return; @@ -155,7 +178,8 @@ public class FileServiceImpl implements FileService { try { OperateLogReq log = OperateLogReq.builder() .serviceName(environment.getProperty("spring.application.name")) - .featureName("oss文件上传") + .featureCode(featureCode) + .featureName(featureName) .operateTime(new Date()) .identityId(liteSaasContext.getIdentityId()) .identityType(liteSaasContext.getIdentityType()) @@ -315,13 +339,13 @@ public class FileServiceImpl implements FileService { return response; } - private FileInformationResponse setFileInfoResp(File ossFile){ - FileInformationResponse resp=new FileInformationResponse(); - resp.setUrl(ossFile.getFileUrl()); - resp.setFileName(ossFile.getFileName()); - resp.setUrlMd5(ossFile.getUrlMd5()); - resp.setFileKey(ossFile.getFileUuid()); - return resp; - } + private FileInformationResponse setFileInfoResp(File ossFile) { + FileInformationResponse resp = new FileInformationResponse(); + resp.setUrl(ossFile.getFileUrl()); + resp.setFileName(ossFile.getFileName()); + resp.setUrlMd5(ossFile.getUrlMd5()); + resp.setFileKey(ossFile.getFileUuid()); + return resp; + } } From 68fa1a126fb55e0521c96bb5999b0920755e23dc Mon Sep 17 00:00:00 2001 From: tianliyong Date: Fri, 2 Dec 2022 15:23:29 +0800 Subject: [PATCH 03/15] =?UTF-8?q?=E6=89=A9=E5=B1=95=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=8F=8A=E5=85=BC=E5=AE=B9=E6=80=A7=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ServerFileController.java | 4 +- .../client/controller/WebFileController.java | 3 +- .../oss/http/api/ServerFileServiceApi.java | 2 +- .../http/model/ServerFileUploadV2Request.java | 26 +++++++++++++ .../cn/axzo/oss/service/api/FileService.java | 2 +- .../oss/service/impl/FileServiceImpl.java | 38 ++++++++++++++----- 6 files changed, 61 insertions(+), 14 deletions(-) create mode 100644 oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileUploadV2Request.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 0933f33..7717d22 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 @@ -47,13 +47,13 @@ public class ServerFileController implements ServerFileServiceApi { } @Override - public CommonResponse uploadV2(ServerFileUploadRequest request) { + public CommonResponse uploadV2(ServerFileUploadV2Request request) { ServerFileUploadDto dto = BeanConvertUtil.copyBean(request, ServerFileUploadDto.class); request.setFileContent(null); // 获取feign调用请求头携带的用户信息 String contextInfoLiteJsonStr = httpServletRequest.getHeader("X-CONTEXT-INFO-LITE"); ContextInfo.LiteSaasContext liteSaasContext = JSONUtil.toBean(contextInfoLiteJsonStr, ContextInfo.LiteSaasContext.class); - return CommonResponse.success(BeanConverter.convert(fileService.uploadV2(dto, liteSaasContext), FileInformationResponse.class)); + return CommonResponse.success(BeanConverter.convert(fileService.uploadV2(request.getServiceName(), dto, liteSaasContext), FileInformationResponse.class)); } /** diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java index 72c9aa4..1d55c12 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java @@ -68,6 +68,7 @@ public class WebFileController { @SneakyThrows public CommonResponse uploadV2(@Valid @RequestParam String appCode, @Valid @RequestParam String bizScene, + @Valid @RequestParam String serviceName, @Valid @RequestParam MultipartFile file) { //获取用户信息 ContextInfo.LiteSaasContext liteSaasContext = null; @@ -81,7 +82,7 @@ public class WebFileController { .fileName(file.getOriginalFilename()) .fileContent(file.getBytes()) .build(); - FileInformationResponse response = fileService.uploadV2(fileUploadDto, liteSaasContext); + FileInformationResponse response = fileService.uploadV2(serviceName, fileUploadDto, liteSaasContext); FileInformationVo result = BeanConvertUtil.copyBean(response, FileInformationVo.class); return CommonResponse.success(result); } 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 66261bb..75d849f 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 @@ -35,7 +35,7 @@ public interface ServerFileServiceApi { * @return */ @RequestMapping(value = "/api/v2/server/upload", method = RequestMethod.POST) - CommonResponse uploadV2(ServerFileUploadRequest request); + CommonResponse uploadV2(ServerFileUploadV2Request request); /** * 删除文件 diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileUploadV2Request.java b/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileUploadV2Request.java new file mode 100644 index 0000000..af33b21 --- /dev/null +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileUploadV2Request.java @@ -0,0 +1,26 @@ +package cn.axzo.oss.http.model; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Author: liyong.tian + * @Date: 2022/12/2 11:26 + * @Description: 服务端文件上传请求类V2 + */ +@Data +public class ServerFileUploadV2Request { + + @NotBlank(message = "appCode must not be null") + private String appCode; + @NotBlank(message = "bizScene must not be null") + private String bizScene; + @NotBlank(message = "fileName must not be null") + private String fileName; + @NotBlank(message = "serviceName must not be null") + private String serviceName; + @NotNull(message = "fileContent must not be null") + 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 d15f015..36b0bea 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 @@ -32,7 +32,7 @@ public interface FileService { List findFileKey(FindFileKeyDto dto); - FileInformationResponse uploadV2(ServerFileUploadDto request, ContextInfo.LiteSaasContext liteSaasContext); + FileInformationResponse uploadV2(String serviceName, ServerFileUploadDto request, ContextInfo.LiteSaasContext liteSaasContext); ServerFileDownloadResponse download(ServerFileDownloadDto 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 index d6a1402..1b632db 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 @@ -25,6 +25,7 @@ import cn.axzo.oss.service.api.FileService; import cn.hutool.core.collection.CollectionUtil; import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.stereotype.Service; @@ -125,15 +126,15 @@ public class FileServiceImpl implements FileService { public ServerFileUploadResponse upload(ServerFileUploadDto dto, ContextInfo.LiteSaasContext liteSaasContext) { File ossFile = uploadFileAndGetFile(dto); //操作日志记录 - operateLog(JSON.toJSONString(dto), FILE_UPLOAD_CODE, FILE_UPLOAD_NAME, liteSaasContext); + operateLog(JSON.toJSONString(dto), "", FILE_UPLOAD_CODE, FILE_UPLOAD_NAME, liteSaasContext); return setResponse(ossFile); } @Override - public FileInformationResponse uploadV2(ServerFileUploadDto request, ContextInfo.LiteSaasContext liteSaasContext) { + public FileInformationResponse uploadV2(String serviceName, ServerFileUploadDto request, ContextInfo.LiteSaasContext liteSaasContext) { File ossFile = uploadFileAndGetFile(request); //操作日志记录 - operateLog(JSON.toJSONString(request), FILE_UPLOAD_CODE, FILE_UPLOAD_NAME, liteSaasContext); + operateLog(JSON.toJSONString(request), serviceName, FILE_UPLOAD_CODE, FILE_UPLOAD_NAME, liteSaasContext); return setFileInfoResp(ossFile); } @@ -169,7 +170,7 @@ public class FileServiceImpl implements FileService { /** * 操作日志记录 */ - private void operateLog(String param, String featureCode, String featureName, ContextInfo.LiteSaasContext liteSaasContext) { + private void operateLog(String param, String serviceName, String featureCode, String featureName, ContextInfo.LiteSaasContext liteSaasContext) { if (liteSaasContext == null || liteSaasContext.getIdentityId() == null || liteSaasContext.getIdentityType() == null) { log.warn("获取用户上下文信息失败"); return; @@ -177,7 +178,7 @@ public class FileServiceImpl implements FileService { //记录日志 try { OperateLogReq log = OperateLogReq.builder() - .serviceName(environment.getProperty("spring.application.name")) + .serviceName(StringUtils.isNotEmpty(serviceName) ? serviceName : environment.getProperty("spring.application.name")) .featureCode(featureCode) .featureName(featureName) .operateTime(new Date()) @@ -219,12 +220,23 @@ public class FileServiceImpl implements FileService { // 检查app code checkAppCode(dto.getAppCode()); - List fileList = fileDao.getByAppCodeAndFileUuids(dto.getAppCode(), dto.getFileKey()); + // 做兼容处理,如果List fileKey如果存在url取出url,不做查询处理 + List urlList = new ArrayList<>(); + List fileKeyList = new ArrayList<>(); + for (String fileKey : dto.getFileKey()) { + if (fileKey.contains("http")) { + urlList.add(fileKey); + } else { + fileKeyList.add(fileKey); + } + } + + List fileList = fileDao.getByAppCodeAndFileUuids(dto.getAppCode(), fileKeyList); if (CollectionUtil.isEmpty(fileList)) { log.warn("find file url is null,key = {}", Arrays.toString(dto.getFileKey().toArray())); return new ArrayList<>(); } - return setFileUrlRes(fileList); + return setFileUrlRes(urlList, fileList); } @Override @@ -245,9 +257,17 @@ public class FileServiceImpl implements FileService { return setFileKeyRes(fileList); } - private List setFileUrlRes(List fileList) { + private List setFileUrlRes(List urlList, List fileList) { List resList = new ArrayList<>(); - fileList.forEach(file -> { + if (CollectionUtil.isNotEmpty(urlList)) { + urlList.stream().forEach(url -> { + FindFileUrlResponse response = new FindFileUrlResponse(); + response.setUrl(url); + response.setFileKey(url); + resList.add(response); + }); + } + fileList.stream().forEach(file -> { FindFileUrlResponse response = new FindFileUrlResponse(); response.setUrl(file.getFileUrl()); response.setFileKey(file.getFileUuid()); From b1b1ac0c3e34603e8662cd7146f0436d67e4776d Mon Sep 17 00:00:00 2001 From: tianliyong Date: Fri, 2 Dec 2022 17:27:41 +0800 Subject: [PATCH 04/15] =?UTF-8?q?=E5=BC=95=E5=85=A5=E6=9D=83=E9=99=90?= =?UTF-8?q?=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oss-common/pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/oss-common/pom.xml b/oss-common/pom.xml index c3f0c5a..f60f8c6 100644 --- a/oss-common/pom.xml +++ b/oss-common/pom.xml @@ -16,6 +16,10 @@ cn.axzo.framework axzo-common + + cn.axzo.framework + axzo-auth-spring-boot-starter + org.springframework.boot spring-boot-starter-aop From d2996c73e2ec5a192cc528d8a9a6e6142480bcbc Mon Sep 17 00:00:00 2001 From: tianliyong Date: Mon, 5 Dec 2022 16:06:59 +0800 Subject: [PATCH 05/15] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=90=8D=E7=A7=B0=E9=95=BF=E5=BA=A6=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oss/client/controller/WebFileController.java | 14 ++++++++++++-- .../java/cn/axzo/oss/common/enums/CodeEnum.java | 1 + .../oss/http/model/ServerFileUploadRequest.java | 2 ++ .../oss/http/model/ServerFileUploadV2Request.java | 2 ++ 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java index 1d55c12..5ccf0ee 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java @@ -6,6 +6,7 @@ import cn.axzo.framework.auth.domain.ContextInfoHolder; import cn.axzo.oss.client.vo.FileInformationVo; import cn.axzo.oss.client.vo.FindFileUrlVo; import cn.axzo.oss.client.vo.WebFileUploadVo; +import cn.axzo.oss.common.exception.BizException; import cn.axzo.oss.common.utils.BeanConvertUtil; import cn.axzo.oss.manager.api.dto.request.FindFileUrlDto; import cn.axzo.oss.manager.api.dto.request.ServerFileDownloadDto; @@ -18,6 +19,7 @@ import cn.axzo.oss.service.api.FileService; import cn.azxo.framework.common.model.CommonResponse; import lombok.SneakyThrows; import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -28,6 +30,8 @@ import java.io.InputStream; import java.io.OutputStream; import java.util.List; +import static cn.axzo.oss.common.enums.CodeEnum.FILE_NAME_TOO_LONG; + /** * 前端文件controller * @@ -37,6 +41,8 @@ import java.util.List; @RestController @RequestMapping("/webApi") public class WebFileController { + + private static int FILE_NAME_MAX_LENGTH = 128; @Resource private FileService fileService; @@ -52,10 +58,12 @@ public class WebFileController { if (contextInfo != null) { liteSaasContext = contextInfo.lite(); } + String filename = file.getOriginalFilename(); + BizException.error(filename.length() > FILE_NAME_MAX_LENGTH, FILE_NAME_TOO_LONG); ServerFileUploadDto fileUploadDto = ServerFileUploadDto.builder() .appCode(appCode) .bizScene(bizScene) - .fileName(file.getOriginalFilename()) + .fileName(filename) .fileContent(file.getBytes()) .build(); ServerFileUploadResponse response = fileService.upload(fileUploadDto, liteSaasContext); @@ -76,10 +84,12 @@ public class WebFileController { if (contextInfo != null) { liteSaasContext = contextInfo.lite(); } + String filename = file.getOriginalFilename(); + BizException.error(filename.length() > FILE_NAME_MAX_LENGTH, FILE_NAME_TOO_LONG); ServerFileUploadDto fileUploadDto = ServerFileUploadDto.builder() .appCode(appCode) .bizScene(bizScene) - .fileName(file.getOriginalFilename()) + .fileName(filename) .fileContent(file.getBytes()) .build(); FileInformationResponse response = fileService.uploadV2(serviceName, fileUploadDto, liteSaasContext); 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 b077d45..2c009d4 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 @@ -41,6 +41,7 @@ public enum CodeEnum implements EnumBase { FILE_FORMAT_NOT_SUPPORTED(109,"file format is not supported"), FILE_UPLOAD_FAILED(109,"file upload failed"), MISSING_REQUEST_PARAM(110, "missing request param"), + FILE_NAME_TOO_LONG(111, "file name too long max 128"), ; diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileUploadRequest.java b/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileUploadRequest.java index 76184d1..b08e896 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileUploadRequest.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileUploadRequest.java @@ -1,6 +1,7 @@ package cn.axzo.oss.http.model; import lombok.Data; +import org.hibernate.validator.constraints.Length; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @@ -20,6 +21,7 @@ public class ServerFileUploadRequest { @NotBlank(message = "bizScene must not be null") private String bizScene; @NotBlank(message = "fileName must not be null") + @Length(max = 128, message = "文件名不能超过128个字符") private String fileName; @NotNull(message = "fileContent must not be null") private byte[] fileContent; diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileUploadV2Request.java b/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileUploadV2Request.java index af33b21..9d7ed4c 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileUploadV2Request.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileUploadV2Request.java @@ -1,6 +1,7 @@ package cn.axzo.oss.http.model; import lombok.Data; +import org.hibernate.validator.constraints.Length; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @@ -18,6 +19,7 @@ public class ServerFileUploadV2Request { @NotBlank(message = "bizScene must not be null") private String bizScene; @NotBlank(message = "fileName must not be null") + @Length(max = 128, message = "文件名不能超过128个字符") private String fileName; @NotBlank(message = "serviceName must not be null") private String serviceName; From 25c42efbddb8d3f17aa0149cb249c925ed8e3804 Mon Sep 17 00:00:00 2001 From: tianliyong Date: Mon, 5 Dec 2022 16:08:41 +0800 Subject: [PATCH 06/15] =?UTF-8?q?=E5=8E=BB=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/oss/client/controller/WebFileController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java index 5ccf0ee..a3c1840 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java @@ -19,7 +19,6 @@ import cn.axzo.oss.service.api.FileService; import cn.azxo.framework.common.model.CommonResponse; import lombok.SneakyThrows; import org.apache.commons.io.IOUtils; -import org.apache.commons.lang3.StringUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; From ebffa55ad6dae9ce4f2a357cbf7bca98d724380f Mon Sep 17 00:00:00 2001 From: tianliyong Date: Mon, 5 Dec 2022 16:47:51 +0800 Subject: [PATCH 07/15] =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=90=8D=E9=95=BF?= =?UTF-8?q?=E5=BA=A6=E5=88=A4=E6=96=AD=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/oss/client/controller/WebFileController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java index a3c1840..e4ab164 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java @@ -58,7 +58,7 @@ public class WebFileController { liteSaasContext = contextInfo.lite(); } String filename = file.getOriginalFilename(); - BizException.error(filename.length() > FILE_NAME_MAX_LENGTH, FILE_NAME_TOO_LONG); + BizException.error(filename.length() < FILE_NAME_MAX_LENGTH, FILE_NAME_TOO_LONG); ServerFileUploadDto fileUploadDto = ServerFileUploadDto.builder() .appCode(appCode) .bizScene(bizScene) @@ -84,7 +84,7 @@ public class WebFileController { liteSaasContext = contextInfo.lite(); } String filename = file.getOriginalFilename(); - BizException.error(filename.length() > FILE_NAME_MAX_LENGTH, FILE_NAME_TOO_LONG); + BizException.error(filename.length() < FILE_NAME_MAX_LENGTH, FILE_NAME_TOO_LONG); ServerFileUploadDto fileUploadDto = ServerFileUploadDto.builder() .appCode(appCode) .bizScene(bizScene) From 9b12d296f8faa799084e13dff53f06daf691eccd Mon Sep 17 00:00:00 2001 From: tianliyong Date: Mon, 5 Dec 2022 17:01:09 +0800 Subject: [PATCH 08/15] =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E6=96=B9=E5=BC=8F=E8=B0=83=E6=95=B4=E4=B8=BA?= =?UTF-8?q?get?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/oss/client/controller/WebFileController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java index e4ab164..d94d65a 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java @@ -110,7 +110,7 @@ public class WebFileController { } @SneakyThrows - @PostMapping("/v1/file/download") + @GetMapping("/v1/file/download") @CrossOrigin public void download(@Valid @RequestParam String appCode, @Valid @RequestParam String fileKey, From 5462c298698235eb160ab9dbc72ceed17de0501d Mon Sep 17 00:00:00 2001 From: tianliyong Date: Mon, 5 Dec 2022 18:28:53 +0800 Subject: [PATCH 09/15] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/oss/client/controller/WebFileController.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java index d94d65a..a905a4b 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java @@ -1,6 +1,7 @@ package cn.axzo.oss.client.controller; import cn.axzo.core.utils.converter.BeanConverter; +import cn.axzo.framework.auth.annotation.PreBuildContext; import cn.axzo.framework.auth.domain.ContextInfo; import cn.axzo.framework.auth.domain.ContextInfoHolder; import cn.axzo.oss.client.vo.FileInformationVo; @@ -37,6 +38,7 @@ import static cn.axzo.oss.common.enums.CodeEnum.FILE_NAME_TOO_LONG; * @author zhangtianyu * @date 2022/4/14 2:56 PM **/ +@PreBuildContext @RestController @RequestMapping("/webApi") public class WebFileController { From 702959c6e09b02f3b1b27aff6bdfd42099904a2f Mon Sep 17 00:00:00 2001 From: tianliyong Date: Mon, 5 Dec 2022 19:18:57 +0800 Subject: [PATCH 10/15] =?UTF-8?q?=E6=93=8D=E4=BD=9C=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E5=8F=82=E6=95=B0=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oss/manager/api/dto/request/ServerFileUploadDto.java | 9 +++++++++ .../java/cn/axzo/oss/service/impl/FileServiceImpl.java | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) 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 4a864c2..6822722 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 @@ -20,4 +20,13 @@ public class ServerFileUploadDto { private String bizScene; private String fileName; private byte[] fileContent; + + @Override + public String toString() { + return "ServerFileUploadDto{" + + "appCode='" + appCode + '\'' + + ", bizScene='" + bizScene + '\'' + + ", fileName='" + fileName + '\'' + + '}'; + } } 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 1b632db..553b66e 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 @@ -126,7 +126,7 @@ public class FileServiceImpl implements FileService { public ServerFileUploadResponse upload(ServerFileUploadDto dto, ContextInfo.LiteSaasContext liteSaasContext) { File ossFile = uploadFileAndGetFile(dto); //操作日志记录 - operateLog(JSON.toJSONString(dto), "", FILE_UPLOAD_CODE, FILE_UPLOAD_NAME, liteSaasContext); + operateLog(dto.toString(), "", FILE_UPLOAD_CODE, FILE_UPLOAD_NAME, liteSaasContext); return setResponse(ossFile); } @@ -134,7 +134,7 @@ public class FileServiceImpl implements FileService { public FileInformationResponse uploadV2(String serviceName, ServerFileUploadDto request, ContextInfo.LiteSaasContext liteSaasContext) { File ossFile = uploadFileAndGetFile(request); //操作日志记录 - operateLog(JSON.toJSONString(request), serviceName, FILE_UPLOAD_CODE, FILE_UPLOAD_NAME, liteSaasContext); + operateLog(request.toString(), serviceName, FILE_UPLOAD_CODE, FILE_UPLOAD_NAME, liteSaasContext); return setFileInfoResp(ossFile); } From 01f3bdf1ce364f29c65b3e456f1e1012ae7c249d Mon Sep 17 00:00:00 2001 From: tianliyong Date: Tue, 6 Dec 2022 16:39:10 +0800 Subject: [PATCH 11/15] =?UTF-8?q?=E7=BB=93=E5=90=88=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E5=AE=9E=E9=99=85=E5=9C=BA=E6=99=AF=E5=8E=BB=E9=99=A4appCode?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/controller/WebFileController.java | 9 ++------- .../cn/axzo/oss/dal/repository/FileDao.java | 6 +++--- .../oss/dal/repository/impl/FileDaoImpl.java | 20 +++++++++---------- .../oss/http/model/FindFileKeyRequest.java | 3 --- .../oss/http/model/FindFileUrlRequest.java | 3 --- .../api/dto/request/FindFileKeyDto.java | 5 ----- .../api/dto/request/FindFileUrlDto.java | 5 ----- .../dto/request/ServerFileDownloadDto.java | 5 ----- .../oss/service/impl/FileServiceImpl.java | 13 +++--------- 9 files changed, 18 insertions(+), 51 deletions(-) diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java index a905a4b..b5df96f 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java @@ -101,10 +101,8 @@ public class WebFileController { @SneakyThrows @PostMapping("/v1/file/getUrl") @CrossOrigin - public CommonResponse> getUrl(@Valid @RequestParam String appCode, - @Valid @RequestParam List fileKey) { + public CommonResponse> getUrl(@Valid @RequestParam List fileKey) { FindFileUrlDto dto = FindFileUrlDto.builder() - .appCode(appCode) .fileKey(fileKey) .build(); List response = fileService.findFileUrl(dto); @@ -114,11 +112,8 @@ public class WebFileController { @SneakyThrows @GetMapping("/v1/file/download") @CrossOrigin - public void download(@Valid @RequestParam String appCode, - @Valid @RequestParam String fileKey, - HttpServletResponse response) { + public void download(@Valid @RequestParam String fileKey, HttpServletResponse response) { ServerFileDownloadDto dto = ServerFileDownloadDto.builder() - .appCode(appCode) .fileKey(fileKey) .build(); ServerFileDownloadResponse result = fileService.download(dto); 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 c191678..badfa26 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 @@ -23,9 +23,9 @@ public interface FileDao extends IService { */ File getByAppCodeAndUrlMd5(String appCode, String urlMd5); - File getByAppCodeAndFileUuid(String appCode, String fileKey); + File getByFileUuid(String fileKey); - List getByAppCodeAndFileUuids(String appCode, List fileKey); + List getByFileUuids(List fileKey); - List getByAppCodeAndUrlMd5s(String appCode, List urlMd5List); + List getByUrlMd5s(List urlMd5List); } 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 8c85f47..2612cc8 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 @@ -29,25 +29,25 @@ public class FileDaoImpl extends ServiceImpl implements FileDa } @Override - public File getByAppCodeAndFileUuid(String appCode, String fileKey) { - return lambdaQuery().eq(File::getAppCode, appCode).eq(File::getFileUuid, fileKey) - .eq(File::getStatus, FileStatus.SUCCESS).eq(File::getIsDelete, TableDelete.UN_DELETED) - .last("limit 1").one(); + public File getByFileUuid(String fileKey) { + return lambdaQuery().eq(File::getFileUuid, fileKey) + .eq(File::getStatus, FileStatus.SUCCESS) + .eq(File::getIsDelete, TableDelete.UN_DELETED) + .last("limit 1") + .one(); } @Override - public List getByAppCodeAndFileUuids(String appCode, List fileKey) { - return lambdaQuery().eq(File::getAppCode, appCode) - .in(File::getFileUuid, fileKey) + public List getByFileUuids(List fileKey) { + return lambdaQuery().in(File::getFileUuid, fileKey) .eq(File::getStatus, FileStatus.SUCCESS) .eq(File::getIsDelete, TableDelete.UN_DELETED) .list(); } @Override - public List getByAppCodeAndUrlMd5s(String appCode, List urlMd5List) { - return lambdaQuery().eq(File::getAppCode, appCode) - .in(File::getUrlMd5, urlMd5List) + public List getByUrlMd5s(List urlMd5List) { + return lambdaQuery().in(File::getUrlMd5, urlMd5List) .eq(File::getStatus, FileStatus.SUCCESS) .eq(File::getIsDelete, TableDelete.UN_DELETED) .list(); diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/model/FindFileKeyRequest.java b/oss-http-api/src/main/java/cn/axzo/oss/http/model/FindFileKeyRequest.java index 60bdfd3..30e484f 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/model/FindFileKeyRequest.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/model/FindFileKeyRequest.java @@ -14,9 +14,6 @@ import java.util.List; @Data public class FindFileKeyRequest { - @NotBlank(message = "appCode must not be null") - private String appCode; - @NotNull(message = "url must not be null") private List url; } diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/model/FindFileUrlRequest.java b/oss-http-api/src/main/java/cn/axzo/oss/http/model/FindFileUrlRequest.java index 7165a4d..8ed03e1 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/model/FindFileUrlRequest.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/model/FindFileUrlRequest.java @@ -14,9 +14,6 @@ import java.util.List; @Data public class FindFileUrlRequest { - @NotBlank(message = "appCode must not be null") - private String appCode; - @NotNull(message = "fileKey must not be null") private List fileKey; } \ No newline at end of file diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/FindFileKeyDto.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/FindFileKeyDto.java index a227165..55efcaa 100644 --- a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/FindFileKeyDto.java +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/FindFileKeyDto.java @@ -18,11 +18,6 @@ import java.util.List; @AllArgsConstructor public class FindFileKeyDto { - /** - * 应用码 - */ - private String appCode; - /** * 文件url */ diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/FindFileUrlDto.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/FindFileUrlDto.java index 2b968eb..5a19c9c 100644 --- a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/FindFileUrlDto.java +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/FindFileUrlDto.java @@ -18,11 +18,6 @@ import java.util.List; @AllArgsConstructor public class FindFileUrlDto { - /** - * 应用码 - */ - private String appCode; - /** * 文件uuid */ diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileDownloadDto.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileDownloadDto.java index 902f5c8..810dba4 100644 --- a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileDownloadDto.java +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileDownloadDto.java @@ -16,11 +16,6 @@ import lombok.NoArgsConstructor; @AllArgsConstructor public class ServerFileDownloadDto { - /** - * 应用码 - */ - private String appCode; - /** * 文件uuid */ 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 553b66e..21a4349 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 @@ -23,7 +23,6 @@ import cn.axzo.oss.manager.api.dto.request.*; import cn.axzo.oss.manager.api.dto.response.*; import cn.axzo.oss.service.api.FileService; import cn.hutool.core.collection.CollectionUtil; -import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -141,10 +140,8 @@ public class FileServiceImpl implements FileService { @Override public ServerFileDownloadResponse download(ServerFileDownloadDto dto) { log.info("file download dto = {}", JsonUtil.obj2Str(dto)); - // 检查app code - checkAppCode(dto.getAppCode()); - File file = fileDao.getByAppCodeAndFileUuid(dto.getAppCode(), dto.getFileKey()); + File file = fileDao.getByFileUuid(dto.getFileKey()); if (Utility.objIsNull(file)) { log.warn("file download is null, fileKey = {}", dto.getFileKey()); return null; @@ -217,8 +214,6 @@ public class FileServiceImpl implements FileService { @Override public List findFileUrl(FindFileUrlDto dto) { log.info("find file url dto = {}", JsonUtil.obj2Str(dto)); - // 检查app code - checkAppCode(dto.getAppCode()); // 做兼容处理,如果List fileKey如果存在url取出url,不做查询处理 List urlList = new ArrayList<>(); @@ -231,7 +226,7 @@ public class FileServiceImpl implements FileService { } } - List fileList = fileDao.getByAppCodeAndFileUuids(dto.getAppCode(), fileKeyList); + List fileList = fileDao.getByFileUuids(fileKeyList); if (CollectionUtil.isEmpty(fileList)) { log.warn("find file url is null,key = {}", Arrays.toString(dto.getFileKey().toArray())); return new ArrayList<>(); @@ -242,14 +237,12 @@ public class FileServiceImpl implements FileService { @Override public List findFileKey(FindFileKeyDto dto) { log.info("find file key dto = {}", JsonUtil.obj2Str(dto)); - // 检查app code - checkAppCode(dto.getAppCode()); List urlMd5List = dto.getUrl().stream() .map(url -> Utility.getMd5(url)) .collect(Collectors.toList()); - List fileList = fileDao.getByAppCodeAndUrlMd5s(dto.getAppCode(), urlMd5List); + List fileList = fileDao.getByUrlMd5s(urlMd5List); if (CollectionUtil.isEmpty(fileList)) { log.warn("find file key is null,url = {}", Arrays.toString(dto.getUrl().toArray())); return new ArrayList<>(); From d8614af1eaeb238e9e6520f8ab25519feb31be01 Mon Sep 17 00:00:00 2001 From: tianliyong Date: Wed, 7 Dec 2022 11:44:32 +0800 Subject: [PATCH 12/15] =?UTF-8?q?feign=E8=B0=83=E7=94=A8=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/oss/client/controller/ServerFileController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 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 7717d22..5e59ad6 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 @@ -47,7 +47,7 @@ public class ServerFileController implements ServerFileServiceApi { } @Override - public CommonResponse uploadV2(ServerFileUploadV2Request request) { + public CommonResponse uploadV2(@Valid @RequestBody ServerFileUploadV2Request request) { ServerFileUploadDto dto = BeanConvertUtil.copyBean(request, ServerFileUploadDto.class); request.setFileContent(null); // 获取feign调用请求头携带的用户信息 @@ -76,7 +76,7 @@ public class ServerFileController implements ServerFileServiceApi { * @return */ @Override - public CommonResponse> getFileUrl(FindFileUrlRequest request) { + public CommonResponse> getFileUrl(@Valid @RequestBody FindFileUrlRequest request) { FindFileUrlDto dto = BeanConvertUtil.copyBean(request, FindFileUrlDto.class); return CommonResponse.success(BeanConverter.convert(fileService.findFileUrl(dto), FindFileUrlResponse.class)); } @@ -88,7 +88,7 @@ public class ServerFileController implements ServerFileServiceApi { * @return */ @Override - public CommonResponse> getFileKey(FindFileKeyRequest request) { + public CommonResponse> getFileKey(@Valid @RequestBody FindFileKeyRequest request) { FindFileKeyDto dto = BeanConvertUtil.copyBean(request, FindFileKeyDto.class); return CommonResponse.success(BeanConverter.convert(fileService.findFileKey(dto), FindFileKeyResponse.class)); } From b66893aa846dbc042064d04a71371e06cc8f6dde Mon Sep 17 00:00:00 2001 From: tianliyong Date: Wed, 7 Dec 2022 14:37:00 +0800 Subject: [PATCH 13/15] =?UTF-8?q?webapi=20=E8=8E=B7=E5=8F=96url=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E4=BC=98=E5=8C=96=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/oss/client/controller/WebFileController.java | 5 +---- .../main/java/cn/axzo/oss/service/impl/FileServiceImpl.java | 4 ++++ 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java index b5df96f..3ee66e9 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java @@ -101,10 +101,7 @@ public class WebFileController { @SneakyThrows @PostMapping("/v1/file/getUrl") @CrossOrigin - public CommonResponse> getUrl(@Valid @RequestParam List fileKey) { - FindFileUrlDto dto = FindFileUrlDto.builder() - .fileKey(fileKey) - .build(); + public CommonResponse> getUrl(@Valid @RequestBody FindFileUrlDto dto) { List response = fileService.findFileUrl(dto); return CommonResponse.success(BeanConverter.convert(response, FindFileUrlVo.class)); } 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 21a4349..edf9ce1 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 @@ -243,6 +243,10 @@ public class FileServiceImpl implements FileService { .collect(Collectors.toList()); List fileList = fileDao.getByUrlMd5s(urlMd5List); + //处理app端历史数据不在file表中的情况 + if (urlMd5List.size() > fileList.size()) { + // TODO: 2022/12/7 + } if (CollectionUtil.isEmpty(fileList)) { log.warn("find file key is null,url = {}", Arrays.toString(dto.getUrl().toArray())); return new ArrayList<>(); From afa2f44515f8c4d039ac4c9cbdd315920617059b Mon Sep 17 00:00:00 2001 From: tianliyong Date: Thu, 8 Dec 2022 11:32:12 +0800 Subject: [PATCH 14/15] =?UTF-8?q?=E6=94=AF=E6=8C=81app=E7=AB=AF=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E6=95=B0=E6=8D=AE=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/controller/WebFileController.java | 2 +- .../oss/service/impl/FileServiceImpl.java | 104 ++++++++++++++++-- 2 files changed, 93 insertions(+), 13 deletions(-) diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java index 3ee66e9..58963fe 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java @@ -119,7 +119,7 @@ public class WebFileController { try { inputStream = result.getFileStream(); response.setContentType("application/x-download"); - response.addHeader("Content-Disposition", "attachment;filename=" + result.getFileKey() + "." + result.getFileFormat()); + response.addHeader("Content-Disposition", "attachment;filename=" + result.getFileName() + "." + result.getFileFormat()); IOUtils.copy(inputStream, outputStream); } catch (Exception e) { e.printStackTrace(); 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 edf9ce1..b079982 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 @@ -23,6 +23,7 @@ import cn.axzo.oss.manager.api.dto.request.*; import cn.axzo.oss.manager.api.dto.response.*; import cn.axzo.oss.service.api.FileService; import cn.hutool.core.collection.CollectionUtil; +import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -30,10 +31,8 @@ import org.springframework.core.env.Environment; import org.springframework.stereotype.Service; import java.io.InputStream; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.List; +import java.util.*; +import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; /** @@ -48,6 +47,12 @@ public class FileServiceImpl implements FileService { private static String FILE_UPLOAD_CODE = "OSS_FILE_UPLOAD"; private static String FILE_UPLOAD_NAME = "文件上传"; + private static String APPCODE_FACE = "face"; + private static String SCENE_FACE = "face"; + private static String APPCODE_IDCARD = "idcard"; + private static String SCENE_IDCARD = "idcard"; + private static String APPCODE_BANKCARD = "bankcard"; + private static String SCENE_BANKCARD = "bankcard"; @Autowired private FileManager fileManager; @@ -238,22 +243,86 @@ public class FileServiceImpl implements FileService { public List findFileKey(FindFileKeyDto dto) { log.info("find file key dto = {}", JsonUtil.obj2Str(dto)); - List urlMd5List = dto.getUrl().stream() + List urlList = dto.getUrl(); + List urlMd5List = urlList.stream() .map(url -> Utility.getMd5(url)) .collect(Collectors.toList()); List fileList = fileDao.getByUrlMd5s(urlMd5List); + //处理app端历史数据不在file表中的情况 if (urlMd5List.size() > fileList.size()) { - // TODO: 2022/12/7 + List existUrlList = fileList.stream().map(File::getFileUrl).collect(Collectors.toList()); + urlList.removeAll(existUrlList); + List resList = setFileKeyResByUrl(urlList); + // 异步新增file数据 + asyncSaveFile(resList); + return resList; } - if (CollectionUtil.isEmpty(fileList)) { - log.warn("find file key is null,url = {}", Arrays.toString(dto.getUrl().toArray())); - return new ArrayList<>(); - } - return setFileKeyRes(fileList); + + return setFileKeyResByFile(fileList); } + private void asyncSaveFile(List resList) { + List> completableFutures = new ArrayList<>(resList.size() / 10 + 1); + Lists.partition(resList, 10) + .forEach(findFileKeyResponses -> completableFutures.add(CompletableFuture.runAsync( + () -> findFileKeyResponses.forEach(response -> saveFile(response)) + ))); + } + + private File saveFile(FindFileKeyResponse response) { + String url = response.getUrl(); + + String appCode = "", bizScene = ""; + if (url.contains(APPCODE_FACE)) { + appCode = APPCODE_FACE; + bizScene = SCENE_FACE; + } else if(url.contains(APPCODE_IDCARD)) { + appCode = APPCODE_IDCARD; + bizScene = SCENE_IDCARD; + } else if(url.contains(APPCODE_BANKCARD)) { + appCode = APPCODE_BANKCARD; + bizScene = SCENE_BANKCARD; + } + if (StringUtils.isEmpty(appCode) || StringUtils.isEmpty(bizScene)) { + throw new BizException(CodeEnum.APP_CODE_NOT_FOUND); + } + // 通过appcode获取文件渠道桶信息 + AppChannelBucket appChannelBucket = appChannelBucketManager.getByAppCode(appCode); + // 通过渠道桶编码获取到具体文件业务场景 + FileBusinessScene scene = fileBusinessSceneManager + .getByBucketNoAndScene(appChannelBucket.getAppChannelBucketNo(), bizScene); + // 通过渠道码和桶名称获取获取指定上传配置 + FileUploadConfig fileUploadConfig = fileUploadConfigManager + .getByUploadConfig(scene.getAppChannelBucketNo(), scene.getDirectory()); + //获取文件名和文件格式 + int dotIndexOf = url.lastIndexOf(FileClassEnum.DOT.type); + int nameIndexOf = url.lastIndexOf(FileClassEnum.SEPARATOR_CHAR.type); + String fileFormat = url.substring(dotIndexOf + CommonConstants.ONE).toLowerCase(); + String fileName = url.substring(nameIndexOf + CommonConstants.ONE, dotIndexOf); + + File ossFile = new File(); + ossFile.setAppCode(appCode); + ossFile.setAppChannelBucketNo(fileUploadConfig.getAppChannelBucketNo()); + ossFile.setAppCode(fileUploadConfig.getAppCode()); + ossFile.setChannelCode(fileUploadConfig.getChannelCode()); + ossFile.setBucketName(fileUploadConfig.getBucketName()); + ossFile.setDirectory(fileUploadConfig.getDirectory()); + ossFile.setFileFormat(fileFormat); + ossFile.setFileUuid(Utility.getUUID()); + ossFile.setFileUrl(response.getUrl()); + ossFile.setUrlMd5(response.getFileKey()); + ossFile.setStorageUnit(fileUploadConfig.getStorageUnit()); + ossFile.setStorageSize(fileUploadConfig.getStorageSize()); + ossFile.setStatus(FileStatusEnum.STATUS_UPLOAD_SUCCESS.getCode()); + ossFile.setFileName(fileName); + fileDao.save(ossFile); + return ossFile; + } + + + private List setFileUrlRes(List urlList, List fileList) { List resList = new ArrayList<>(); if (CollectionUtil.isNotEmpty(urlList)) { @@ -273,7 +342,18 @@ public class FileServiceImpl implements FileService { return resList; } - private List setFileKeyRes(List fileList) { + private List setFileKeyResByUrl(List urlList) { + List resList = new ArrayList<>(); + urlList.stream().forEach(url -> { + FindFileKeyResponse response = new FindFileKeyResponse(); + response.setUrl(url); + response.setFileKey(Utility.getUUID()); + resList.add(response); + }); + return resList; + } + + private List setFileKeyResByFile(List fileList) { List resList = new ArrayList<>(); fileList.forEach(file -> { FindFileKeyResponse response = new FindFileKeyResponse(); From ca96f76846470f0436913f17004979d55566e355 Mon Sep 17 00:00:00 2001 From: tianliyong Date: Thu, 8 Dec 2022 11:36:51 +0800 Subject: [PATCH 15/15] =?UTF-8?q?=E6=94=AF=E6=8C=81app=E7=AB=AF=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E6=95=B0=E6=8D=AE=E5=A4=84=E7=90=86=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= 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, 5 insertions(+), 2 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 b079982..df1866b 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 @@ -31,7 +31,10 @@ import org.springframework.core.env.Environment; import org.springframework.stereotype.Service; import java.io.InputStream; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; @@ -310,7 +313,7 @@ public class FileServiceImpl implements FileService { ossFile.setBucketName(fileUploadConfig.getBucketName()); ossFile.setDirectory(fileUploadConfig.getDirectory()); ossFile.setFileFormat(fileFormat); - ossFile.setFileUuid(Utility.getUUID()); + ossFile.setFileUuid(response.getFileKey()); ossFile.setFileUrl(response.getUrl()); ossFile.setUrlMd5(response.getFileKey()); ossFile.setStorageUnit(fileUploadConfig.getStorageUnit());