From 8bb392446f885b9f0d500ffb32de1fa7b2d299b7 Mon Sep 17 00:00:00 2001 From: xudawei Date: Tue, 25 Jun 2024 14:43:48 +0800 Subject: [PATCH 1/9] =?UTF-8?q?=E4=B8=B4=E6=97=B6=E6=8E=88=E6=9D=83?= =?UTF-8?q?=E5=8A=A0=E4=B8=8A-=E4=B8=8D=E4=BF=9D=E5=AD=98file=E8=87=B3?= =?UTF-8?q?=E6=9C=AC=E5=9C=B0db?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ServerFileController.java | 9 + .../oss/http/api/ServerFileServiceApi.java | 10 ++ .../http/model/ApiSignUrlDownloadRequest.java | 5 + .../http/model/ApiSignUrlUploadRequest.java | 4 + .../api/dto/request/SignUrlDownloadDto.java | 2 + .../api/dto/request/SignUrlUploadDto.java | 5 + .../cn/axzo/oss/service/api/FileService.java | 5 + .../oss/service/impl/FileServiceImpl.java | 159 +++++++----------- .../oss/service/metafile/WithFileFactory.java | 54 ++++++ .../oss/service/metafile/WithFileService.java | 61 +++++++ .../metafile/impl/HandleFileService.java | 96 +++++++++++ .../metafile/impl/IgnoreFileService.java | 62 +++++++ 12 files changed, 374 insertions(+), 98 deletions(-) create mode 100644 oss-service/src/main/java/cn/axzo/oss/service/metafile/WithFileFactory.java create mode 100644 oss-service/src/main/java/cn/axzo/oss/service/metafile/WithFileService.java create mode 100644 oss-service/src/main/java/cn/axzo/oss/service/metafile/impl/HandleFileService.java create mode 100644 oss-service/src/main/java/cn/axzo/oss/service/metafile/impl/IgnoreFileService.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 2f2a617..6bb0f24 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 @@ -137,6 +137,15 @@ public class ServerFileController implements ServerFileServiceApi { return CommonResponse.success(BeanConverter.convert(fileService.signUrlDownload(dto), ApiSignUrlDownloadResponse.class)); } + /** + * 授权给第三方下载-生成临时url + */ + @Override + public CommonResponse> signUrlFetchDownloadNoFile(@Valid @RequestBody ApiSignUrlDownloadRequest request) { + SignUrlDownloadDto dto = BeanConvertUtil.copyBean(request, SignUrlDownloadDto.class); + return CommonResponse.success(BeanConverter.convert(fileService.signUrlDownloadNoFile(dto), ApiSignUrlDownloadResponse.class)); + } + /** * 授权给第三方上传-生成临时url */ 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 b3ce9d0..8e4d452 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 @@ -20,9 +20,11 @@ import cn.axzo.oss.http.model.ServerFileUploadResponse; import cn.axzo.oss.http.model.ServerFileUploadV2Request; import cn.azxo.framework.common.model.CommonResponse; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import javax.validation.Valid; import java.util.List; /** @@ -81,6 +83,14 @@ public interface ServerFileServiceApi { @RequestMapping(value = "api/signUrl/fetchDownload", method = RequestMethod.POST) CommonResponse> signUrlFetchDownload(ApiSignUrlDownloadRequest request); + /** + * 临时授权下载-生成临时url + */ + @RequestMapping(value = "api/signUrl/fetchDownloadNoFile", method = RequestMethod.POST) + CommonResponse> signUrlFetchDownloadNoFile(@Valid @RequestBody ApiSignUrlDownloadRequest request); + + + /** * 临时授权上传-生成临时url */ diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/model/ApiSignUrlDownloadRequest.java b/oss-http-api/src/main/java/cn/axzo/oss/http/model/ApiSignUrlDownloadRequest.java index 45bde52..9225a7a 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/model/ApiSignUrlDownloadRequest.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/model/ApiSignUrlDownloadRequest.java @@ -32,6 +32,11 @@ public class ApiSignUrlDownloadRequest { */ private String bizScene; + /** + * bizScene,对应目录 + */ + private String appCode; + /** * 图片样式,比如x-oss-process=image/auto-orient,1/resize,p_50/quality,q_30 */ diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/model/ApiSignUrlUploadRequest.java b/oss-http-api/src/main/java/cn/axzo/oss/http/model/ApiSignUrlUploadRequest.java index 32d3b14..9a4a93a 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/model/ApiSignUrlUploadRequest.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/model/ApiSignUrlUploadRequest.java @@ -61,4 +61,8 @@ public class ApiSignUrlUploadRequest { * 是否带上文件名称 */ private Boolean hasFileName = true; + /** + * 桶key + */ + private String bucketKey; } diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/SignUrlDownloadDto.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/SignUrlDownloadDto.java index 1b40527..20b670d 100644 --- a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/SignUrlDownloadDto.java +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/SignUrlDownloadDto.java @@ -34,6 +34,8 @@ public class SignUrlDownloadDto { */ private String bizScene; + private String appCode; + /** * 图片样式,比如x-oss-process=image/auto-orient,1/resize,p_50/quality,q_30 */ diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/SignUrlUploadDto.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/SignUrlUploadDto.java index 5afb663..2bcd299 100644 --- a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/SignUrlUploadDto.java +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/SignUrlUploadDto.java @@ -62,4 +62,9 @@ public class SignUrlUploadDto { * 是否带上文件名称 */ private Boolean hasFileName = true; + + /** + * 桶key + */ + private String bucketKey; } 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 932fc3c..c93e563 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 @@ -92,4 +92,9 @@ public interface FileService { * 元数据 */ ManaGetObjectMetaResponse getObjectMeta(String bucketName, String key, String url,String channelCode); + + /** + * 授权给第三方下载 + */ + List signUrlDownloadNoFile(SignUrlDownloadDto 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 c4b11f9..720b7d0 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 @@ -54,6 +54,8 @@ import cn.axzo.oss.manager.api.dto.response.SignUrlDownloadResponse; import cn.axzo.oss.manager.api.dto.response.SignUrlUploadResponse; import cn.axzo.oss.manager.api.vo.SignUrlUploadVo; import cn.axzo.oss.service.api.FileService; +import cn.axzo.oss.service.metafile.WithFileFactory; +import cn.axzo.oss.service.metafile.WithFileService; import cn.hutool.core.collection.CollectionUtil; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -133,8 +135,8 @@ public class FileServiceImpl implements FileService { @Value("${sign.url.download.expire.second:2000}") private Long SIGN_URL_DOWNLOAD_EXPIRE_SECOND; - @Value("${sign.url.upload.expire.second:2000}") - private Long SIGN_URL_UPLOAD_EXPIRE_SECOND; + @Autowired + private WithFileFactory withFileFactory; /** * 删除文件 @@ -892,29 +894,46 @@ public class FileServiceImpl implements FileService { // bucket下的key String tgtFileKey = Utility.generateFileKey(item.getDirectory(), item.getFileUuid(), item.getFileFormat()); String bucketType = StringUtils.isNotBlank(bucketTypeMap.get(item.getAppChannelBucketNo())) ? bucketTypeMap.get(item.getAppChannelBucketNo()) : BucketTypeEnum.PRIVATE_BUCKET.getCode(); - switch (BucketTypeEnum.getByCode(bucketType)) { - case PUBLIC_BUCKET://公有桶 - 永久链接,例如 http://xxx.png - String url = this.fileManager.fetchDownloadUrl(item.getBucketName(), tgtFileKey, item.getChannelCode()); - return SignUrlDownloadResponse.builder() - .signUrl(this.buildPublicXImageProcess(url, style)) - .fileKey(item.getFileUuid()) - .fileName(item.getFileName()) - .build(); - case PRIVATE_BUCKET://私有桶 - 临时授权链接 例如 http://xxx.png?Expire=a&AccessKeyId=b&Signature=c&repsonse-content-disposition=d - String signUrl = this.fileManager.signUrlDownload(item.getBucketName(), tgtFileKey, Objects.nonNull(expire) ? expire : SIGN_URL_DOWNLOAD_EXPIRE_SECOND , item.getChannelCode(), item.getFileName(), style, hasFileName); - return SignUrlDownloadResponse.builder() - .signUrl(UrlUtil.httpToHttps(signUrl)) - .fileKey(item.getFileUuid()) - .fileName(item.getFileName()) - .build(); - default: - BizException.error(CodeEnum.CHANNEL_TYPE_NOT_EXIST); - } - return SignUrlDownloadResponse.builder().build(); + return this.buildSignUrlDownloadResponse(bucketType, item.getBucketName(), tgtFileKey, item.getChannelCode(), item.getFileUuid(), item.getFileName(), style, hasFileName, expire); }).collect(Collectors.toList()); return responseList; } + /** + * 构建临时授权下载返回对象 + * @param bucketType 公有桶/私有桶 + * @param bucketName 桶名称 + * @param tgtFileKey 桶key + * @param channelCode aliyun/huaweicloud + * @param fileUuid 文件标识 + * @param fileName 文件名称 + * @param style 裁剪样式 + * @param hasFileName 是否显示文件名称 + * @param expire 过期时间 + * @return 临时授权下载返回对象 + */ + private SignUrlDownloadResponse buildSignUrlDownloadResponse(String bucketType, String bucketName, String tgtFileKey, String channelCode, String fileUuid, String fileName, String style, Boolean hasFileName,Long expire) { + switch (BucketTypeEnum.getByCode(bucketType)) { + case PUBLIC_BUCKET://公有桶 - 永久链接,例如 http://xxx.png + String url = this.fileManager.fetchDownloadUrl(bucketName, tgtFileKey, channelCode);//item.getBucketName() item.getChannelCode() + return SignUrlDownloadResponse.builder() + .signUrl(this.buildPublicXImageProcess(url, style)) + .fileKey(fileUuid)//item.getFileUuid() + .fileName(fileName)//item.getFileName() + .build(); + case PRIVATE_BUCKET://私有桶 - 临时授权链接 例如 http://xxx.png?Expire=a&AccessKeyId=b&Signature=c&repsonse-content-disposition=d + String signUrl = this.fileManager.signUrlDownload(bucketName, tgtFileKey, Objects.nonNull(expire) ? expire : SIGN_URL_DOWNLOAD_EXPIRE_SECOND , channelCode, fileName, style, hasFileName); + return SignUrlDownloadResponse.builder() + .signUrl(UrlUtil.httpToHttps(signUrl)) + .fileKey(fileUuid) + .fileName(fileName) + .build(); + default: + BizException.error(CodeEnum.CHANNEL_TYPE_NOT_EXIST); + } + return SignUrlDownloadResponse.builder().build(); + } + /** * 构建http链接(非fileKey入参)返回对象 */ @@ -1058,87 +1077,12 @@ public class FileServiceImpl implements FileService { //操作日志记录 operateLog(dto.toString(), dto.getServiceName(), FILE_UPLOAD_CODE, FILE_UPLOAD_NAME, liteSaasContext); //3 保存File对象 - SignUrlUploadResponse response = this.signUrlSaveFile(dto, fileUploadConfig, scene, appChannelBucket); + WithFileService withFileService = withFileFactory.getFileService(dto.getBizScene()); + SignUrlUploadResponse response = withFileService.saveFile(dto, fileUploadConfig, scene, appChannelBucket); log.info("signUrl upload dto = {}, times:{}", JsonUtil.obj2Str(dto), System.currentTimeMillis() - start); return response; } - /** - * - * @param dto - * @param fileUploadConfig - * @return - */ - private SignUrlUploadResponse signUrlSaveFile(SignUrlUploadDto dto, FileUploadConfig fileUploadConfig, FileBusinessScene scene, AppChannelBucket appChannelBucket) { - String uuid = Utility.getUUID(); - - int lastIndexOf = dto.getFileName().lastIndexOf(FileClassEnum.DOT.type); - BizException - .error(lastIndexOf != CommonConstants.NOT_FOUND_INDEX_OF, CodeEnum.NOT_FILE_FORMAT); - - // 是否包含指定格式 - String fileFormat = dto.getFileName().substring(lastIndexOf + CommonConstants.ONE).toLowerCase(); - - // 文件格式判断 - String[] formats = fileUploadConfig.getFileFormat().split(FileClassEnum.COMMA.type); - // 是否包含指定格式 - BizException.error(Arrays.asList(formats).contains(fileFormat), CodeEnum.FILE_FORMAT_NOT_SUPPORTED); - - // 生成上传文件的唯一key - String tgtFileKey = Utility.generateFileKey(fileUploadConfig.getDirectory(), uuid, fileFormat); - // 失效时间 - Long expiration = this.buildExpiration(dto, scene); - //1 调用阿里云/华为云 获取临时授权signUrl - SignUrlUploadVo signUrlUpload = this.fileManager.signUrlUpload(fileUploadConfig.getBucketName(), tgtFileKey, dto.getFileName(),expiration - , fileUploadConfig.getChannelCode() - , StringUtils.isNotBlank(dto.getContentType()) ? dto.getContentType() : "multipart/form-data", appChannelBucket.getBucketType() - , Objects.isNull(dto.getHasFileName()) ? true: dto.getHasFileName() ); - //2 保存File对象 - this.saveOssFile(fileUploadConfig, dto.getFileName(), fileFormat, uuid, - signUrlUpload.getDownloadSignUrl(), Utility.getMd5(signUrlUpload.getDownloadSignUrl()), expiration); - return SignUrlUploadResponse.builder() - .signUrl(UrlUtil.httpToHttps(signUrlUpload.getSignUrl())) - .fileKey(uuid) - .contentType(signUrlUpload.getContentType()) - .host(signUrlUpload.getHost()) - .channelCode(signUrlUpload.getChannelCode()) - .downloadSignUrl(UrlUtil.httpToHttps(signUrlUpload.getDownloadSignUrl())) - .fileName(dto.getFileName()) - .build(); - } - - /** - * 临时授权失效时间 - * 优先从业务入参取值,业务入参失效时间为空,则从oss配置中取失效时间 - */ - private Long buildExpiration(SignUrlUploadDto dto, FileBusinessScene scene) { - if (Objects.nonNull(dto) && Objects.nonNull(dto.getExpiration())) { - return dto.getExpiration(); - } - return scene.getUploadExpiration(); - } - - /** - * 授权给第三方下载,获取文件上传配置 - */ - private FileUploadConfig signUrlBuildUploadConfig(SignUrlUploadDto dto) { - FileUploadConfig fileUploadConfig = new FileUploadConfig(); - if (Objects.nonNull(dto.getChannelType()) && StringUtils.isNoneBlank(dto.getBucketName()) && StringUtils.isNoneBlank(dto.getBizScene())) { - AppChannelBucket appChannelBucket = appChannelBucketManager.getByAppCodeChannelCodeBucket(dto.getAppCode(), dto.getChannelType(), dto.getBucketName()); - - // 通过渠道桶编码获取到具体文件业务场景 - FileBusinessScene scene = fileBusinessSceneManager - .getByBucketNoAndScene(appChannelBucket.getAppChannelBucketNo(), dto.getBizScene()); - - // 通过渠道码和桶名称获取指定上传配置 - fileUploadConfig = fileUploadConfigManager - .getByUploadConfig(scene.getAppChannelBucketNo(), scene.getDirectory()); - } else { - fileUploadConfig = getFileUploadConfig(dto.getAppCode(), dto.getBizScene(), dto.getChannelType()); - } - BizException.isEmpty(Objects.nonNull(fileUploadConfig) || StringUtils.isNotBlank(fileUploadConfig.getAppChannelBucketNo()), CodeEnum.NO_UPLOAD_CONFIG); - return fileUploadConfig; - } /** * 授权给第三方-下载 @@ -1165,4 +1109,23 @@ public class FileServiceImpl implements FileService { return response; } + /** + * 授权给第三方下载 + */ + @Override + public List signUrlDownloadNoFile(SignUrlDownloadDto dto) { + // 通过appcode获取文件渠道桶信息 + AppChannelBucket appChannelBucket = appChannelBucketManager.getByAppCode(dto.getAppCode(), null); + + // 通过渠道桶编码获取到具体文件业务场景 + FileBusinessScene scene = fileBusinessSceneManager + .getByBucketNoAndScene(appChannelBucket.getAppChannelBucketNo(), dto.getBizScene()); + + return dto.getFileKeys().stream().map(item ->{ + //构建返回集合 + return this.buildSignUrlDownloadResponse(appChannelBucket.getBucketType(), appChannelBucket.getBucketName() + , item, appChannelBucket.getChannelCode(), item, null, null, false, scene.getDownloadExpiration()); + }).collect(Collectors.toList()); + } + } diff --git a/oss-service/src/main/java/cn/axzo/oss/service/metafile/WithFileFactory.java b/oss-service/src/main/java/cn/axzo/oss/service/metafile/WithFileFactory.java new file mode 100644 index 0000000..0f3cf29 --- /dev/null +++ b/oss-service/src/main/java/cn/axzo/oss/service/metafile/WithFileFactory.java @@ -0,0 +1,54 @@ +package cn.axzo.oss.service.metafile; + +import com.google.common.collect.Maps; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * @Author xudawei@axzo.cn + * @Description file工厂 + * @Date 2024/06/25 + **/ +@Service +@RefreshScope +public class WithFileFactory { + + private Map serviceMap = Maps.newConcurrentMap(); + + private static final String DEFAULT_SERVICE = "handleFileService"; + + @Value("${ignore.file.biz.scene:attendance,attendance1=ignoreFileService}") + private String ignoreFileBizScene; + + public WithFileFactory(List serviceList) { + serviceList.stream().forEach(item -> { + serviceMap.put(item.fetchServiceName(), item); + }); + } + + public WithFileService getFileService(String serviceKey) { + String serviceName = this.buildServiceName(serviceKey); + return Objects.nonNull(serviceMap.get(serviceName)) ? serviceMap.get(serviceName) : serviceMap.get(DEFAULT_SERVICE); + } + + private String buildServiceName(String serviceKey) { + String[] strs = ignoreFileBizScene.split(";"); + for (String str : strs) { + if (StringUtils.hasText(str) && str.contains(serviceKey)) { + return str.split("=")[1]; + } + } + return ""; + } + + public void putService(String serviceName, WithFileService withFileService) { + serviceMap.put(serviceName, withFileService); + } + +} diff --git a/oss-service/src/main/java/cn/axzo/oss/service/metafile/WithFileService.java b/oss-service/src/main/java/cn/axzo/oss/service/metafile/WithFileService.java new file mode 100644 index 0000000..069ef3b --- /dev/null +++ b/oss-service/src/main/java/cn/axzo/oss/service/metafile/WithFileService.java @@ -0,0 +1,61 @@ +package cn.axzo.oss.service.metafile; + +import cn.axzo.oss.common.constans.CommonConstants; +import cn.axzo.oss.common.enums.CodeEnum; +import cn.axzo.oss.common.enums.FileClassEnum; +import cn.axzo.oss.common.exception.BizException; +import cn.axzo.oss.dal.entity.AppChannelBucket; +import cn.axzo.oss.dal.entity.FileBusinessScene; +import cn.axzo.oss.dal.entity.FileUploadConfig; +import cn.axzo.oss.manager.api.dto.request.SignUrlUploadDto; +import cn.axzo.oss.manager.api.dto.response.SignUrlUploadResponse; + +import java.util.Arrays; +import java.util.Objects; + +/** + * @Author xudawei@axzo.cn + * @Description file相关 + * @Date 2024/06/25 + **/ +public abstract class WithFileService { + + public SignUrlUploadResponse saveFile(SignUrlUploadDto dto, FileUploadConfig fileUploadConfig, FileBusinessScene scene, AppChannelBucket appChannelBucket) { + String fileFormat = this.check(dto, fileUploadConfig); + return this.doSaveFile(dto, fileUploadConfig, scene, appChannelBucket, fileFormat); + } + + public abstract SignUrlUploadResponse doSaveFile(SignUrlUploadDto dto, FileUploadConfig fileUploadConfig, FileBusinessScene scene, AppChannelBucket appChannelBucket, String fileFormat); + + public abstract String fetchServiceName(); + + /** + * 校验 + */ + public String check(SignUrlUploadDto dto, FileUploadConfig fileUploadConfig) { + int lastIndexOf = dto.getFileName().lastIndexOf(FileClassEnum.DOT.type); + BizException + .error(lastIndexOf != CommonConstants.NOT_FOUND_INDEX_OF, CodeEnum.NOT_FILE_FORMAT); + + // 是否包含指定格式 + String fileFormat = dto.getFileName().substring(lastIndexOf + CommonConstants.ONE).toLowerCase(); + + // 文件格式判断 + String[] formats = fileUploadConfig.getFileFormat().split(FileClassEnum.COMMA.type); + // 是否包含指定格式 + BizException.error(Arrays.asList(formats).contains(fileFormat), CodeEnum.FILE_FORMAT_NOT_SUPPORTED); + return fileFormat; + } + + /** + * 临时授权失效时间 + * 优先从业务入参取值,业务入参失效时间为空,则从oss配置中取失效时间 + */ + public Long buildExpiration(SignUrlUploadDto dto, FileBusinessScene scene) { + if (Objects.nonNull(dto) && Objects.nonNull(dto.getExpiration())) { + return dto.getExpiration(); + } + return scene.getUploadExpiration(); + } + +} diff --git a/oss-service/src/main/java/cn/axzo/oss/service/metafile/impl/HandleFileService.java b/oss-service/src/main/java/cn/axzo/oss/service/metafile/impl/HandleFileService.java new file mode 100644 index 0000000..4692980 --- /dev/null +++ b/oss-service/src/main/java/cn/axzo/oss/service/metafile/impl/HandleFileService.java @@ -0,0 +1,96 @@ +package cn.axzo.oss.service.metafile.impl; + +import cn.axzo.oss.common.enums.FileStatusEnum; +import cn.axzo.oss.common.utils.UrlUtil; +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.FileBusinessScene; +import cn.axzo.oss.dal.entity.FileUploadConfig; +import cn.axzo.oss.dal.repository.FileDao; +import cn.axzo.oss.manager.api.FileManager; +import cn.axzo.oss.manager.api.dto.request.SignUrlUploadDto; +import cn.axzo.oss.manager.api.dto.response.SignUrlUploadResponse; +import cn.axzo.oss.manager.api.vo.SignUrlUploadVo; +import cn.axzo.oss.service.metafile.WithFileService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.stereotype.Service; + +import java.util.Objects; + +/** + * @Author xudawei@axzo.cn + * @Description file操作 + * @Date 2024/06/25 + **/ +@Service("handleFileService") +@RefreshScope +public class HandleFileService extends WithFileService{ + + @Autowired + private FileManager fileManager; + + @Autowired + private FileDao fileDao; + + public SignUrlUploadResponse doSaveFile(SignUrlUploadDto dto, FileUploadConfig fileUploadConfig, FileBusinessScene scene, AppChannelBucket appChannelBucket, String fileFormat) { + String uuid = Utility.getUUID(); + // 生成上传文件的唯一key + String tgtFileKey = Utility.generateFileKey(fileUploadConfig.getDirectory(), uuid, fileFormat); + // 失效时间 + Long expiration = this.buildExpiration(dto, scene); + //1 调用阿里云/华为云 获取临时授权signUrl + SignUrlUploadVo signUrlUpload = this.fileManager.signUrlUpload(fileUploadConfig.getBucketName(), tgtFileKey, dto.getFileName(),expiration + , fileUploadConfig.getChannelCode() + , StringUtils.isNotBlank(dto.getContentType()) ? dto.getContentType() : "multipart/form-data", appChannelBucket.getBucketType() + , Objects.isNull(dto.getHasFileName()) ? true: dto.getHasFileName() ); + //2 保存File对象 + this.saveOssFile(fileUploadConfig, dto.getFileName(), fileFormat, uuid, + signUrlUpload.getDownloadSignUrl(), Utility.getMd5(signUrlUpload.getDownloadSignUrl()), expiration); + return SignUrlUploadResponse.builder() + .signUrl(UrlUtil.httpToHttps(signUrlUpload.getSignUrl())) + .fileKey(uuid) + .contentType(signUrlUpload.getContentType()) + .host(signUrlUpload.getHost()) + .channelCode(signUrlUpload.getChannelCode()) + .downloadSignUrl(UrlUtil.httpToHttps(signUrlUpload.getDownloadSignUrl())) + .fileName(dto.getFileName()) + .build(); + } + + @Override + public String fetchServiceName() { + return "handleFileService"; + } + + + private File saveOssFile(FileUploadConfig fileUploadConfig, String fileName, String fileConform, String uuid, + String fileUrl, String fileMd5, Long expiration) { + 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); + ossFile.setFileUuid(uuid); + ossFile.setFileUrl(fileUrl); + ossFile.setUrlMd5(Utility.getMd5(fileUrl)); + ossFile.setStatus(FileStatusEnum.STATUS_UPLOAD_SUCCESS.getCode()); + ossFile.setFileName(fileName); + ossFile.setFileMd5(fileMd5); + fileDao.save(ossFile); + return ossFile; + } + + +// @Override +// public void afterPropertiesSet() throws Exception { +// withFileFactory.putService("handleFileService", this); +// } +} diff --git a/oss-service/src/main/java/cn/axzo/oss/service/metafile/impl/IgnoreFileService.java b/oss-service/src/main/java/cn/axzo/oss/service/metafile/impl/IgnoreFileService.java new file mode 100644 index 0000000..d47e501 --- /dev/null +++ b/oss-service/src/main/java/cn/axzo/oss/service/metafile/impl/IgnoreFileService.java @@ -0,0 +1,62 @@ +package cn.axzo.oss.service.metafile.impl; + +import cn.axzo.oss.common.utils.UrlUtil; +import cn.axzo.oss.dal.entity.AppChannelBucket; +import cn.axzo.oss.dal.entity.FileBusinessScene; +import cn.axzo.oss.dal.entity.FileUploadConfig; +import cn.axzo.oss.manager.api.FileManager; +import cn.axzo.oss.manager.api.dto.request.SignUrlUploadDto; +import cn.axzo.oss.manager.api.dto.response.SignUrlUploadResponse; +import cn.axzo.oss.manager.api.vo.SignUrlUploadVo; +import cn.axzo.oss.service.metafile.WithFileService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.stereotype.Service; + +import java.util.Objects; + +/** + * @Author xudawei@axzo.cn + * @Description 忽略file操作 + * @Date 2024/06/25 + **/ +@Service("ignoreFileService") +@RefreshScope +public class IgnoreFileService extends WithFileService{ + + @Autowired + private FileManager fileManager; + + + public SignUrlUploadResponse doSaveFile(SignUrlUploadDto dto, FileUploadConfig fileUploadConfig, FileBusinessScene scene, AppChannelBucket appChannelBucket,String fileFormat) { + + // 失效时间 + Long expiration = this.buildExpiration(dto, scene); + //1 调用阿里云/华为云 获取临时授权signUrl + SignUrlUploadVo signUrlUpload = this.fileManager.signUrlUpload(fileUploadConfig.getBucketName(), dto.getBucketKey(), dto.getFileName(),expiration + , fileUploadConfig.getChannelCode() + , StringUtils.isNotBlank(dto.getContentType()) ? dto.getContentType() : "multipart/form-data", appChannelBucket.getBucketType() + , Objects.isNull(dto.getHasFileName()) ? true: dto.getHasFileName() ); + return SignUrlUploadResponse.builder() + .signUrl(UrlUtil.httpToHttps(signUrlUpload.getSignUrl())) + .fileKey(dto.getBucketKey()) + .contentType(signUrlUpload.getContentType()) + .host(signUrlUpload.getHost()) + .channelCode(signUrlUpload.getChannelCode()) + .downloadSignUrl(UrlUtil.httpToHttps(signUrlUpload.getDownloadSignUrl())) + .fileName(dto.getFileName()) + .build(); + } + + @Override + public String fetchServiceName() { + return "ignoreFileService"; + } + + +// @Override +// public void afterPropertiesSet() throws Exception { +// withFileFactory.putService("ignoreFileService", this); +// } +} From 0593e4dd6ed2d80c1913897a01979b8456f7dd7c Mon Sep 17 00:00:00 2001 From: xudawei Date: Wed, 26 Jun 2024 18:23:05 +0800 Subject: [PATCH 2/9] =?UTF-8?q?=E4=B8=B4=E6=97=B6=E6=8E=88=E6=9D=83?= =?UTF-8?q?=E5=8A=A0=E4=B8=8A-=E4=B8=8D=E4=BF=9D=E5=AD=98file=E8=87=B3?= =?UTF-8?q?=E6=9C=AC=E5=9C=B0db?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oss/service/impl/FileServiceImpl.java | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 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 720b7d0..0304ccb 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 @@ -894,7 +894,25 @@ public class FileServiceImpl implements FileService { // bucket下的key String tgtFileKey = Utility.generateFileKey(item.getDirectory(), item.getFileUuid(), item.getFileFormat()); String bucketType = StringUtils.isNotBlank(bucketTypeMap.get(item.getAppChannelBucketNo())) ? bucketTypeMap.get(item.getAppChannelBucketNo()) : BucketTypeEnum.PRIVATE_BUCKET.getCode(); - return this.buildSignUrlDownloadResponse(bucketType, item.getBucketName(), tgtFileKey, item.getChannelCode(), item.getFileUuid(), item.getFileName(), style, hasFileName, expire); + switch (BucketTypeEnum.getByCode(bucketType)) { + case PUBLIC_BUCKET://公有桶 - 永久链接,例如 http://xxx.png + String url = this.fileManager.fetchDownloadUrl(item.getBucketName(), tgtFileKey, item.getChannelCode()); + return SignUrlDownloadResponse.builder() + .signUrl(this.buildPublicXImageProcess(url, style)) + .fileKey(item.getFileUuid()) + .fileName(item.getFileName()) + .build(); + case PRIVATE_BUCKET://私有桶 - 临时授权链接 例如 http://xxx.png?Expire=a&AccessKeyId=b&Signature=c&repsonse-content-disposition=d + String signUrl = this.fileManager.signUrlDownload(item.getBucketName(), tgtFileKey, Objects.nonNull(expire) ? expire : SIGN_URL_DOWNLOAD_EXPIRE_SECOND , item.getChannelCode(), item.getFileName(), style, hasFileName); + return SignUrlDownloadResponse.builder() + .signUrl(UrlUtil.httpToHttps(signUrl)) + .fileKey(item.getFileUuid()) + .fileName(item.getFileName()) + .build(); + default: + BizException.error(CodeEnum.CHANNEL_TYPE_NOT_EXIST); + } + return SignUrlDownloadResponse.builder().build(); }).collect(Collectors.toList()); return responseList; } @@ -906,27 +924,22 @@ public class FileServiceImpl implements FileService { * @param tgtFileKey 桶key * @param channelCode aliyun/huaweicloud * @param fileUuid 文件标识 - * @param fileName 文件名称 - * @param style 裁剪样式 - * @param hasFileName 是否显示文件名称 * @param expire 过期时间 * @return 临时授权下载返回对象 */ - private SignUrlDownloadResponse buildSignUrlDownloadResponse(String bucketType, String bucketName, String tgtFileKey, String channelCode, String fileUuid, String fileName, String style, Boolean hasFileName,Long expire) { + private SignUrlDownloadResponse buildSignUrlDownloadResponse(String bucketType, String bucketName, String tgtFileKey, String channelCode, String fileUuid, Long expire) { switch (BucketTypeEnum.getByCode(bucketType)) { case PUBLIC_BUCKET://公有桶 - 永久链接,例如 http://xxx.png String url = this.fileManager.fetchDownloadUrl(bucketName, tgtFileKey, channelCode);//item.getBucketName() item.getChannelCode() return SignUrlDownloadResponse.builder() - .signUrl(this.buildPublicXImageProcess(url, style)) + .signUrl(this.buildPublicXImageProcess(url, null)) .fileKey(fileUuid)//item.getFileUuid() - .fileName(fileName)//item.getFileName() .build(); case PRIVATE_BUCKET://私有桶 - 临时授权链接 例如 http://xxx.png?Expire=a&AccessKeyId=b&Signature=c&repsonse-content-disposition=d - String signUrl = this.fileManager.signUrlDownload(bucketName, tgtFileKey, Objects.nonNull(expire) ? expire : SIGN_URL_DOWNLOAD_EXPIRE_SECOND , channelCode, fileName, style, hasFileName); + String signUrl = this.fileManager.signUrlDownload(bucketName, tgtFileKey, Objects.nonNull(expire) ? expire : SIGN_URL_DOWNLOAD_EXPIRE_SECOND , channelCode, null, null, false); return SignUrlDownloadResponse.builder() .signUrl(UrlUtil.httpToHttps(signUrl)) .fileKey(fileUuid) - .fileName(fileName) .build(); default: BizException.error(CodeEnum.CHANNEL_TYPE_NOT_EXIST); @@ -1124,7 +1137,7 @@ public class FileServiceImpl implements FileService { return dto.getFileKeys().stream().map(item ->{ //构建返回集合 return this.buildSignUrlDownloadResponse(appChannelBucket.getBucketType(), appChannelBucket.getBucketName() - , item, appChannelBucket.getChannelCode(), item, null, null, false, scene.getDownloadExpiration()); + , item, appChannelBucket.getChannelCode(), item, scene.getDownloadExpiration()); }).collect(Collectors.toList()); } From 73b73087bbdf1624f12c0cbc20b2453be1ebe9cf Mon Sep 17 00:00:00 2001 From: xudawei Date: Thu, 4 Jul 2024 19:23:42 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E4=B8=B4=E6=97=B6=E6=8E=88=E6=9D=83?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD-=E5=8A=A0=E4=B8=8Aexpire?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ServerFileController.java | 15 +++- .../oss/http/api/ServerFileServiceApi.java | 8 +++ .../http/model/ApiSignUrlDownloadRequest.java | 5 ++ .../FetchUploadSignUrlToPublishRequest.java | 68 +++++++++++++++++++ .../FetchUploadSignUrlToPublishResponse.java | 54 +++++++++++++++ .../FetchUploadSignUrlToPublishDto.java | 64 +++++++++++++++++ .../api/dto/request/SignUrlDownloadDto.java | 5 ++ .../oss/service/impl/FileServiceImpl.java | 21 +++--- 8 files changed, 229 insertions(+), 11 deletions(-) create mode 100644 oss-http-api/src/main/java/cn/axzo/oss/http/model/FetchUploadSignUrlToPublishRequest.java create mode 100644 oss-http-api/src/main/java/cn/axzo/oss/http/model/FetchUploadSignUrlToPublishResponse.java create mode 100644 oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/FetchUploadSignUrlToPublishDto.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 6bb0f24..4364829 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 @@ -14,6 +14,8 @@ import cn.axzo.oss.http.model.ApiSignUrlUploadRequest; import cn.axzo.oss.http.model.ApiSignUrlUploadResponse; import cn.axzo.oss.http.model.BatchGetObjectMetaRequest; import cn.axzo.oss.http.model.BatchGetObjectMetaResponse; +import cn.axzo.oss.http.model.FetchUploadSignUrlToPublishRequest; +import cn.axzo.oss.http.model.FetchUploadSignUrlToPublishResponse; import cn.axzo.oss.http.model.FileInformationResponse; import cn.axzo.oss.http.model.FindFileKeyRequest; import cn.axzo.oss.http.model.FindFileKeyResponse; @@ -42,8 +44,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; @@ -223,4 +223,15 @@ public class ServerFileController implements ServerFileServiceApi { ContextInfo.LiteSaasContext liteSaasContext = JSONUtil.toBean(contextInfoLiteJsonStr, ContextInfo.LiteSaasContext.class); return CommonResponse.success(BeanConverter.convert(fileByUrlService.uploadByUrl(dto.getAppCode(), dto.getBizScene(), dto.getFileName(), dto.getFileUrl(), dto.getChannelCode(), dto.getStyle(), liteSaasContext), ServerFileUploadResponse.class)); } + + /** + * 临时授权上传-生成临时url-公有桶 + */ + @Override + public CommonResponse fetchUploadSignUrlToPublish(@Valid @RequestBody FetchUploadSignUrlToPublishRequest request) { + SignUrlUploadDto dto = BeanConvertUtil.copyBean(request, SignUrlUploadDto.class); + dto.setAppCode(dto.getAppCode() + "-public"); + dto.setBizScene(dto.getAppCode() + "-public"); + return CommonResponse.success(BeanConverter.convert(fileService.signUrlUpload(dto, ContextInfo.LiteSaasContext.builder().build()), FetchUploadSignUrlToPublishResponse.class)); + } } 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 8e4d452..c1a3afa 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 @@ -6,6 +6,8 @@ import cn.axzo.oss.http.model.ApiSignUrlUploadRequest; import cn.axzo.oss.http.model.ApiSignUrlUploadResponse; import cn.axzo.oss.http.model.BatchGetObjectMetaRequest; import cn.axzo.oss.http.model.BatchGetObjectMetaResponse; +import cn.axzo.oss.http.model.FetchUploadSignUrlToPublishRequest; +import cn.axzo.oss.http.model.FetchUploadSignUrlToPublishResponse; import cn.axzo.oss.http.model.FileInformationResponse; import cn.axzo.oss.http.model.FindFileKeyRequest; import cn.axzo.oss.http.model.FindFileKeyResponse; @@ -117,4 +119,10 @@ public interface ServerFileServiceApi { @RequestMapping(value = "/api/v1/server/uploadByUrl", method = RequestMethod.POST) CommonResponse uploadByUrl(ServerFileUploadByUrlRequest request); + /** + * 临时授权上传-生成临时url-公有桶 + */ + @RequestMapping(value = "/api/v1/server/fetchUploadToPublishSignUrl", method = RequestMethod.POST) + CommonResponse fetchUploadSignUrlToPublish(@Valid @RequestBody FetchUploadSignUrlToPublishRequest request); + } diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/model/ApiSignUrlDownloadRequest.java b/oss-http-api/src/main/java/cn/axzo/oss/http/model/ApiSignUrlDownloadRequest.java index 9225a7a..72afce4 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/model/ApiSignUrlDownloadRequest.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/model/ApiSignUrlDownloadRequest.java @@ -47,4 +47,9 @@ public class ApiSignUrlDownloadRequest { */ private Boolean hasFileName = true; + /** + * 过期时间 + */ + private Long expiration; + } diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/model/FetchUploadSignUrlToPublishRequest.java b/oss-http-api/src/main/java/cn/axzo/oss/http/model/FetchUploadSignUrlToPublishRequest.java new file mode 100644 index 0000000..07057e3 --- /dev/null +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/model/FetchUploadSignUrlToPublishRequest.java @@ -0,0 +1,68 @@ +package cn.axzo.oss.http.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; + +/** + * @author: xudawei + * @date: 2024-03-12 + * @description: 授权给第三方下载 + **/ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FetchUploadSignUrlToPublishRequest { + /** + * appCode + */ + @NotBlank(message = "appCode not blank") + private String appCode; + /** + * bizScene,对应目录 + */ + @NotBlank(message = "bizScene not blank") + private String bizScene; + /** + * serviceName + */ + private String serviceName; + + /** + * 1-阿里云-aliyun + * 2-华为云-huaweicloud + */ + private Integer channelType; + /** + * 桶名称 + */ + private String bucketName; + + /** + * 文件名称 + */ + private String fileName; + + /** + * 类型 + */ + private String contentType = "multipart/form-data"; + + /** + * 过期时间 + */ + private Long expiration; + + /** + * 是否带上文件名称 + */ + private Boolean hasFileName = true; + /** + * 桶key + */ + private String bucketKey; +} diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/model/FetchUploadSignUrlToPublishResponse.java b/oss-http-api/src/main/java/cn/axzo/oss/http/model/FetchUploadSignUrlToPublishResponse.java new file mode 100644 index 0000000..a217017 --- /dev/null +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/model/FetchUploadSignUrlToPublishResponse.java @@ -0,0 +1,54 @@ +package cn.axzo.oss.http.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author: xudawei + * @Date: 2024/03/12 + * @Description: 授权给第三方下载 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FetchUploadSignUrlToPublishResponse { + + /** + * 文件临时-URL + */ + private String signUrl; + /** + * 文件 Key + */ + private String fileKey; + + /** + * host + */ + private String host; + + /** + * 类型 + */ + private String contentType; + + /** + * 通道 + * 1-阿里云-aliyun + * 2-华为云-huaweicloud + */ + private String channelCode; + + /** + * 下载url + */ + private String downloadSignUrl; + + /** + * 文件名称 + */ + private String fileName; +} diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/FetchUploadSignUrlToPublishDto.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/FetchUploadSignUrlToPublishDto.java new file mode 100644 index 0000000..bfdb07c --- /dev/null +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/FetchUploadSignUrlToPublishDto.java @@ -0,0 +1,64 @@ +package cn.axzo.oss.manager.api.dto.request; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author: xudawei + * @date: 2024-03-12 + * @description: 授权给第三方下载 + **/ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FetchUploadSignUrlToPublishDto { + /** + * appCode + */ + private String appCode; + /** + * bizScene,对应目录 + */ + private String bizScene; + /** + * serviceName + */ + private String serviceName; + + /** + * 1-阿里云-aliyun + * 2-华为云-huaweicloud + */ + private Integer channelType; + /** + * 桶名称 + */ + private String bucketName; + + /** + * 文件名称 + */ + private String fileName; + + /** + * 类型 + */ + private String contentType = "multipart/form-data"; + + /** + * 过期时间 + */ + private Long expiration; + + /** + * 是否带上文件名称 + */ + private Boolean hasFileName = true; + /** + * 桶key + */ + private String bucketKey; +} diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/SignUrlDownloadDto.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/SignUrlDownloadDto.java index 20b670d..078fc8e 100644 --- a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/SignUrlDownloadDto.java +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/SignUrlDownloadDto.java @@ -45,4 +45,9 @@ public class SignUrlDownloadDto { */ private Boolean hasFileName = true; + /** + * 过期时间 + */ + private Long expiration; + } 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 0304ccb..2c1ab07 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 @@ -850,7 +850,7 @@ public class FileServiceImpl implements FileService { List httpUrlSignResList = this.buildHttpUrlSignResponse(dto); //3 构建fileKey入参对象集合 - List fileKeyResList = this.buildFileKeyResponse(dto.getFileKeys(), dto.getBizScene(), dto.getStyle(), dto.getHasFileName()); + List fileKeyResList = this.buildFileKeyResponse(dto.getFileKeys(), dto.getBizScene(), dto.getStyle(), dto.getHasFileName(), dto.getExpiration()); //4 1/2/3集合累加 httpUrlResList.addAll(fileKeyResList); httpUrlResList.addAll(httpUrlSignResList); @@ -861,7 +861,7 @@ public class FileServiceImpl implements FileService { /** * 构建fileKey(非http的入参)的返回对象 */ - private List buildFileKeyResponse(List fileKeys, String bizScene, String style, boolean hasFileName) { + private List buildFileKeyResponse(List fileKeys, String bizScene, String style, boolean hasFileName, Long expiration) { if (CollectionUtil.isEmpty(fileKeys)) { return Lists.newArrayList(); } @@ -882,15 +882,15 @@ public class FileServiceImpl implements FileService { List fileBusinessSceneList = fileBusinessSceneManager.queryByBucketNoAndScene(fileList.stream().map(File::getAppChannelBucketNo).collect(Collectors.toSet()), bizScene); Map bizSceneExpireMap = fileBusinessSceneList.stream().collect(Collectors.toMap(FileBusinessScene::getAppChannelBucketNo, FileBusinessScene::getDownloadExpiration, (x, y) -> y)); //构建返回集合 - return this.buildFileKeyRespByFile(fileList, bucketTypeMap, bizSceneExpireMap, style, hasFileName); + return this.buildFileKeyRespByFile(fileList, bucketTypeMap, bizSceneExpireMap, style, hasFileName, expiration); } /** * 通过File对象,构建返回集合 */ - private List buildFileKeyRespByFile(List fileList,Map bucketTypeMap, Map bizSceneExpireMap, String style, boolean hasFileName) { + private List buildFileKeyRespByFile(List fileList,Map bucketTypeMap, Map bizSceneExpireMap, String style, boolean hasFileName, Long expiration) { List responseList = fileList.stream().map(item -> { - Long expire = bizSceneExpireMap.get(item.getAppChannelBucketNo()); + Long expire = Objects.nonNull(expiration) ? expiration : bizSceneExpireMap.get(item.getAppChannelBucketNo()); // bucket下的key String tgtFileKey = Utility.generateFileKey(item.getDirectory(), item.getFileUuid(), item.getFileFormat()); String bucketType = StringUtils.isNotBlank(bucketTypeMap.get(item.getAppChannelBucketNo())) ? bucketTypeMap.get(item.getAppChannelBucketNo()) : BucketTypeEnum.PRIVATE_BUCKET.getCode(); @@ -995,7 +995,7 @@ public class FileServiceImpl implements FileService { if (CollectionUtil.isEmpty(map)) { return httpUrlList.stream().map(item -> SignUrlDownloadResponse.builder().fileKey(item).signUrl(item).build()).collect(Collectors.toList()); } - List responseList = this.buildFileKeyResponse(Lists.newArrayList(map.values()), null, dto.getStyle(), dto.getHasFileName()); + List responseList = this.buildFileKeyResponse(Lists.newArrayList(map.values()), null, dto.getStyle(), dto.getHasFileName(), dto.getExpiration()); if (CollectionUtil.isEmpty(responseList)) { return httpUrlList.stream().map(item -> SignUrlDownloadResponse.builder().fileKey(item).signUrl(item).build()).collect(Collectors.toList()); } @@ -1024,12 +1024,13 @@ public class FileServiceImpl implements FileService { * 从链接中提取fileKey,比如如下链接,获取fileKey:b4148fbee6954c2fa3139471f18a2dcd * https://xx/identity/b4148fbee6954c2fa3139471f18a2dcd.jpg?AccessKeyId=xx&Expires=xx&response-content-disposition=xx&Signature=xx */ - private String signUrlToFileKey(String signUrl) { + public static String signUrlToFileKey(String signUrl) { if (StringUtils.isBlank(signUrl)) { return StringUtils.EMPTY; } if (signUrl.contains("/") && signUrl.contains("?")) { - String fileName = signUrl.substring(signUrl.lastIndexOf("/") + 1, signUrl.indexOf("?")); + signUrl = signUrl.split("\\?")[0]; + String fileName = signUrl.substring(signUrl.lastIndexOf("/") + 1); if (fileName.contains(".")) { return fileName.substring(0, fileName.indexOf(".")); } @@ -1127,6 +1128,7 @@ public class FileServiceImpl implements FileService { */ @Override public List signUrlDownloadNoFile(SignUrlDownloadDto dto) { + // 通过appcode获取文件渠道桶信息 AppChannelBucket appChannelBucket = appChannelBucketManager.getByAppCode(dto.getAppCode(), null); @@ -1134,10 +1136,11 @@ public class FileServiceImpl implements FileService { FileBusinessScene scene = fileBusinessSceneManager .getByBucketNoAndScene(appChannelBucket.getAppChannelBucketNo(), dto.getBizScene()); + Long expiration = Objects.nonNull(dto.getExpiration()) ? dto.getExpiration() : scene.getDownloadExpiration(); return dto.getFileKeys().stream().map(item ->{ //构建返回集合 return this.buildSignUrlDownloadResponse(appChannelBucket.getBucketType(), appChannelBucket.getBucketName() - , item, appChannelBucket.getChannelCode(), item, scene.getDownloadExpiration()); + , item, appChannelBucket.getChannelCode(), item, expiration); }).collect(Collectors.toList()); } From 0db846dc85997e9a12998ae6a06226b8784e3c9d Mon Sep 17 00:00:00 2001 From: xudawei Date: Sun, 21 Jul 2024 23:02:37 +0800 Subject: [PATCH 4/9] =?UTF-8?q?[=E8=80=83=E5=8B=A4=E5=AF=B9=E6=8E=A5]?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=85=83=E6=95=B0=E6=8D=AE=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ServerFileController.java | 29 +--------- .../cn/axzo/oss/common/utils/UrlUtil.java | 3 + .../oss/http/model/GetObjectMetaRequest.java | 4 ++ .../api/dto/request/GetObjectMetaDto.java | 38 +++++++++++++ .../cn/axzo/oss/service/api/FileService.java | 7 +++ .../oss/service/impl/FileServiceImpl.java | 57 +++++++++++++++++++ 6 files changed, 112 insertions(+), 26 deletions(-) create mode 100644 oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/GetObjectMetaDto.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 4364829..58661fe 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 @@ -30,6 +30,7 @@ import cn.axzo.oss.http.model.ServerFileUploadResponse; import cn.axzo.oss.http.model.ServerFileUploadV2Request; 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.GetObjectMetaDto; import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; import cn.axzo.oss.manager.api.dto.request.ServerFileUploadByUrlDto; import cn.axzo.oss.manager.api.dto.request.ServerFileUploadDto; @@ -163,32 +164,8 @@ public class ServerFileController implements ServerFileServiceApi { */ @Override public CommonResponse getObjectMeta(@RequestBody GetObjectMetaRequest request) { - if (!StringUtils.hasText(request.getUrl()) && !StringUtils.hasText(request.getBucketName()) && !StringUtils.hasText(request.getKey())) { - throw new BizException(CodeEnum.URL_BUCKET_NAME_KEY_ALL_EMPTY); - } - - String bucketName = UrlUtil.fetchBucketName(request.getBucketName(), request.getUrl()); - String bucketKey = UrlUtil.fetchBucketKey(request.getKey(), request.getUrl()); - ManaGetObjectMetaResponse response = this.fileService.getObjectMeta(bucketName - , bucketKey, request.getUrl() - , this.swtchChannelCode(request.getUrl())); - return CommonResponse.success(BeanConverter.convert(response, GetObjectMetaResponse.class)); - } - - /** - * 决定渠道 - */ - private String swtchChannelCode(String url) { - if (!StringUtils.hasText(url)) { - return ""; - } - if (url.toLowerCase().contains("aliyun")) { - return ChannelTypeEnum.OSS.getChannelCode(); - } - if (url.toLowerCase().contains("huaweicloud")) { - return ChannelTypeEnum.OBS.getChannelCode(); - } - return url; + GetObjectMetaDto dto = BeanConvertUtil.copyBean(request, GetObjectMetaDto.class); + return CommonResponse.success(BeanConverter.convert(this.fileService.getObjectMeta(dto), GetObjectMetaResponse.class)); } /** diff --git a/oss-common/src/main/java/cn/axzo/oss/common/utils/UrlUtil.java b/oss-common/src/main/java/cn/axzo/oss/common/utils/UrlUtil.java index 5609600..f155473 100644 --- a/oss-common/src/main/java/cn/axzo/oss/common/utils/UrlUtil.java +++ b/oss-common/src/main/java/cn/axzo/oss/common/utils/UrlUtil.java @@ -39,6 +39,9 @@ public class UrlUtil { if (org.springframework.util.StringUtils.hasText(bucketName)) { return bucketName; } + if (url.contains("?")) { + url = url.split("\\?")[0]; + } if (org.springframework.util.StringUtils.hasText(url)) { if (url.contains(".") && url.contains("//")) { return url.substring(url.indexOf("//") + 2,url.indexOf(".")); diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/model/GetObjectMetaRequest.java b/oss-http-api/src/main/java/cn/axzo/oss/http/model/GetObjectMetaRequest.java index 3f5e951..0e06d41 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/model/GetObjectMetaRequest.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/model/GetObjectMetaRequest.java @@ -31,4 +31,8 @@ public class GetObjectMetaRequest { * 唯一标识 */ private String id; + /** + * 文件对象key + */ + private String fileKey; } diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/GetObjectMetaDto.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/GetObjectMetaDto.java new file mode 100644 index 0000000..e86a17e --- /dev/null +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/GetObjectMetaDto.java @@ -0,0 +1,38 @@ +package cn.axzo.oss.manager.api.dto.request; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author: xudawei + * @date: 2024-07-16 + * @description: 元数据 + **/ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class GetObjectMetaDto { + /** + * 桶名称 + */ + private String bucketName; + /** + * 文件key + */ + private String key; + /** + * 文件url + */ + private String url; + /** + * 唯一标识 + */ + private String id; + /** + * 文件对象key + */ + private String fileKey; +} 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 c93e563..b885d7d 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 @@ -4,6 +4,7 @@ import cn.axzo.framework.auth.domain.ContextInfo; import cn.axzo.oss.manager.api.dto.request.DeleteFileDto; 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.GetObjectMetaDto; import cn.axzo.oss.manager.api.dto.request.MultipartUploadCompleteDto; import cn.axzo.oss.manager.api.dto.request.MultipartUploadDto; import cn.axzo.oss.manager.api.dto.request.MultipartUploadFileDto; @@ -23,6 +24,7 @@ import cn.axzo.oss.manager.api.dto.response.ServerFileDownloadResponse; import cn.axzo.oss.manager.api.dto.response.ServerFileUploadResponse; import cn.axzo.oss.manager.api.dto.response.SignUrlDownloadResponse; import cn.axzo.oss.manager.api.dto.response.SignUrlUploadResponse; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -93,6 +95,11 @@ public interface FileService { */ ManaGetObjectMetaResponse getObjectMeta(String bucketName, String key, String url,String channelCode); + /** + * 文件元数据信息 + */ + ManaGetObjectMetaResponse getObjectMeta(@RequestBody GetObjectMetaDto 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 2c1ab07..9ddc1e8 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.core.utils.converter.BeanConverter; import cn.axzo.framework.auth.domain.ContextInfo; import cn.axzo.log.platform.client.LogPlatClient; import cn.axzo.log.platform.client.model.OperateLogReq; @@ -33,6 +34,7 @@ import cn.axzo.oss.manager.api.dto.PartETag; import cn.axzo.oss.manager.api.dto.request.DeleteFileDto; 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.GetObjectMetaDto; import cn.axzo.oss.manager.api.dto.request.MultipartUploadCompleteDto; import cn.axzo.oss.manager.api.dto.request.MultipartUploadDto; import cn.axzo.oss.manager.api.dto.request.MultipartUploadFileDto; @@ -56,6 +58,7 @@ import cn.axzo.oss.manager.api.vo.SignUrlUploadVo; import cn.axzo.oss.service.api.FileService; import cn.axzo.oss.service.metafile.WithFileFactory; import cn.axzo.oss.service.metafile.WithFileService; +import cn.azxo.framework.common.model.CommonResponse; import cn.hutool.core.collection.CollectionUtil; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -67,6 +70,7 @@ import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.core.env.Environment; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; @@ -1110,6 +1114,59 @@ public class FileServiceImpl implements FileService { fileManager.deleteFile(file.getBucketName(), tgtFileKey,file.getChannelCode()); fileDao.deleteFile(dto.getFileKey()); } + + + /** + * 文件元数据信息 + */ + @Override + public ManaGetObjectMetaResponse getObjectMeta(@RequestBody GetObjectMetaDto dto) { + if (!org.springframework.util.StringUtils.hasText(dto.getUrl()) && !org.springframework.util.StringUtils.hasText(dto.getBucketName()) + && !org.springframework.util.StringUtils.hasText(dto.getKey()) && !org.springframework.util.StringUtils.hasText(dto.getFileKey())) { + throw new BizException(CodeEnum.URL_BUCKET_NAME_KEY_ALL_EMPTY); + } + String bucketName = StringUtils.EMPTY; + String bucketKey = StringUtils.EMPTY; + String channelCode = StringUtils.EMPTY; + String url = StringUtils.EMPTY; + if (org.springframework.util.StringUtils.hasText(dto.getFileKey())) { + File byFileUuid = this.fileDao.getByFileUuid(dto.getFileKey()); + if (Objects.nonNull(byFileUuid)) { + bucketName = byFileUuid.getBucketName(); + bucketKey = Utility.generateFileKey(byFileUuid.getDirectory(), byFileUuid.getFileUuid(), byFileUuid.getFileFormat()); + channelCode = byFileUuid.getChannelCode(); + url = byFileUuid.getFileUrl(); + } + } + if (StringUtils.isBlank(bucketName) && StringUtils.isBlank(bucketKey)) { + bucketName = UrlUtil.fetchBucketName(dto.getBucketName(), dto.getUrl()); + bucketKey = UrlUtil.fetchBucketKey(dto.getKey(), dto.getUrl()); + channelCode = this.swtchChannelCode(dto.getUrl()); + url = dto.getUrl(); + } + + ManaGetObjectMetaResponse response = this.getObjectMeta(bucketName + , bucketKey, url + , channelCode); + return BeanConverter.convert(response, ManaGetObjectMetaResponse.class); + } + + /** + * 决定渠道 + */ + private String swtchChannelCode(String url) { + if (!org.springframework.util.StringUtils.hasText(url)) { + return ""; + } + if (url.toLowerCase().contains("aliyun")) { + return ChannelTypeEnum.OSS.getChannelCode(); + } + if (url.toLowerCase().contains("huaweicloud")) { + return ChannelTypeEnum.OBS.getChannelCode(); + } + return url; + } + /** * 元数据 */ From 36ee7c5439ae47bfe9d9cc402e72e8fe66037712 Mon Sep 17 00:00:00 2001 From: xudawei Date: Mon, 22 Jul 2024 11:06:11 +0800 Subject: [PATCH 5/9] =?UTF-8?q?[=E8=80=83=E5=8B=A4=E5=AF=B9=E6=8E=A5]?= =?UTF-8?q?=E5=BF=BD=E7=95=A5=E4=BF=9D=E5=AD=98file=E7=9A=84appCode?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/axzo/oss/service/metafile/WithFileFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oss-service/src/main/java/cn/axzo/oss/service/metafile/WithFileFactory.java b/oss-service/src/main/java/cn/axzo/oss/service/metafile/WithFileFactory.java index 0f3cf29..af8cbc5 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/metafile/WithFileFactory.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/metafile/WithFileFactory.java @@ -23,7 +23,7 @@ public class WithFileFactory { private static final String DEFAULT_SERVICE = "handleFileService"; - @Value("${ignore.file.biz.scene:attendance,attendance1=ignoreFileService}") + @Value("${ignore.file.biz.scene:attendance-snap,attendance1=ignoreFileService}") private String ignoreFileBizScene; public WithFileFactory(List serviceList) { From 28609963f2a2c5ca4e9c3ed2ae058ee4845ddd1e Mon Sep 17 00:00:00 2001 From: xudawei Date: Mon, 29 Jul 2024 16:19:01 +0800 Subject: [PATCH 6/9] =?UTF-8?q?[=E8=80=83=E5=8B=A4=E5=AF=B9=E6=8E=A5]?= =?UTF-8?q?=E5=BF=BD=E7=95=A5=E4=BF=9D=E5=AD=98file=E7=9A=84appCode?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oss/service/impl/FileServiceImpl.java | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) 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 9ddc1e8..b4670c7 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 @@ -59,6 +59,7 @@ import cn.axzo.oss.service.api.FileService; import cn.axzo.oss.service.metafile.WithFileFactory; import cn.axzo.oss.service.metafile.WithFileService; import cn.azxo.framework.common.model.CommonResponse; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -886,7 +887,33 @@ public class FileServiceImpl implements FileService { List fileBusinessSceneList = fileBusinessSceneManager.queryByBucketNoAndScene(fileList.stream().map(File::getAppChannelBucketNo).collect(Collectors.toSet()), bizScene); Map bizSceneExpireMap = fileBusinessSceneList.stream().collect(Collectors.toMap(FileBusinessScene::getAppChannelBucketNo, FileBusinessScene::getDownloadExpiration, (x, y) -> y)); //构建返回集合 - return this.buildFileKeyRespByFile(fileList, bucketTypeMap, bizSceneExpireMap, style, hasFileName, expiration); + List responseList = this.buildFileKeyRespByFile(fileList, bucketTypeMap, bizSceneExpireMap, style, hasFileName, expiration); + //获取不在dbFile中,但是在默认axzo-obs-private中的key + responseList.addAll(fetchNoFileAndObsPrivate(fileKeys, fileList)); + return responseList; + } + + /** + * 获取不在dbFile中,但是在默认axzo-obs-private中的key + */ + private List fetchNoFileAndObsPrivate(List fileKeys, List fileList) { + if (CollectionUtil.isEmpty(fileKeys)) { + return Lists.newArrayList(); + } + List fileDbList = Lists.newArrayList(); + if (CollectionUtil.isNotEmpty(fileList)) { + fileDbList = fileList.stream().map(File::getFileUuid).collect(Collectors.toList()); + } + List subtractToList = CollUtil.subtractToList(fileKeys, fileDbList); + + List collect = Lists.newArrayList(); + if (CollectionUtil.isNotEmpty(subtractToList)) { + collect = subtractToList.stream().map(item -> this.buildSignUrlDownloadResponse(BucketTypeEnum.PRIVATE_BUCKET.getCode(), + "axzo-obs-private", item, ChannelTypeEnum.OBS.getChannelCode() + , item, null)) + .collect(Collectors.toList()); + } + return collect; } /** From 5ec56dd3abd7a1157802fc9f988e92d98a62a260 Mon Sep 17 00:00:00 2001 From: xudawei Date: Tue, 30 Jul 2024 11:39:34 +0800 Subject: [PATCH 7/9] =?UTF-8?q?[=E8=80=83=E5=8B=A4=E5=AF=B9=E6=8E=A5]?= =?UTF-8?q?=E5=BF=BD=E7=95=A5=E4=BF=9D=E5=AD=98file=E7=9A=84appCode?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/oss/service/impl/FileServiceImpl.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 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 b4670c7..940bedb 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 @@ -875,9 +875,13 @@ public class FileServiceImpl implements FileService { return Lists.newArrayList(); } + List responseList = Lists.newArrayList(); + List fileList = fileDao.getByFileUuids(fileKeyList); + //获取不在dbFile中,但是在默认axzo-obs-private中的key + responseList.addAll(fetchNoFileAndObsPrivate(fileKeys, fileList)); if (CollectionUtils.isEmpty(fileList)) { - return Lists.newArrayList(); + return responseList; } //通过appChannelBucketNo集合,获取文件渠道桶信息 @@ -887,9 +891,7 @@ public class FileServiceImpl implements FileService { List fileBusinessSceneList = fileBusinessSceneManager.queryByBucketNoAndScene(fileList.stream().map(File::getAppChannelBucketNo).collect(Collectors.toSet()), bizScene); Map bizSceneExpireMap = fileBusinessSceneList.stream().collect(Collectors.toMap(FileBusinessScene::getAppChannelBucketNo, FileBusinessScene::getDownloadExpiration, (x, y) -> y)); //构建返回集合 - List responseList = this.buildFileKeyRespByFile(fileList, bucketTypeMap, bizSceneExpireMap, style, hasFileName, expiration); - //获取不在dbFile中,但是在默认axzo-obs-private中的key - responseList.addAll(fetchNoFileAndObsPrivate(fileKeys, fileList)); + responseList.addAll(this.buildFileKeyRespByFile(fileList, bucketTypeMap, bizSceneExpireMap, style, hasFileName, expiration)); return responseList; } From ae8fb095562bc430591b866dfd3fe8598082b598 Mon Sep 17 00:00:00 2001 From: xudawei Date: Sat, 14 Sep 2024 18:36:43 +0800 Subject: [PATCH 8/9] =?UTF-8?q?[=E8=80=83=E5=8B=A4=E5=AF=B9=E6=8E=A5]?= =?UTF-8?q?=E4=B8=B4=E6=97=B6=E6=8E=88=E6=9D=83=E4=B8=8D=E5=9C=A8file?= =?UTF-8?q?=E8=A1=A8=E4=B8=AD=EF=BC=8C=E4=BC=98=E5=8C=96=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 940bedb..1a2b43d 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 @@ -879,7 +879,7 @@ public class FileServiceImpl implements FileService { List fileList = fileDao.getByFileUuids(fileKeyList); //获取不在dbFile中,但是在默认axzo-obs-private中的key - responseList.addAll(fetchNoFileAndObsPrivate(fileKeys, fileList)); + responseList.addAll(fetchNoFileAndObsPrivate(fileKeyList, fileList)); if (CollectionUtils.isEmpty(fileList)) { return responseList; } From 9963fdff2aba6136bd8385f1f7fdf8f627cbff41 Mon Sep 17 00:00:00 2001 From: xudawei Date: Wed, 9 Oct 2024 16:21:09 +0800 Subject: [PATCH 9/9] =?UTF-8?q?feat:(2673)=20=E4=BC=98=E5=8C=96buildPublic?= =?UTF-8?q?XImageProcess?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 092798a..683b767 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 @@ -986,7 +986,7 @@ public class FileServiceImpl implements FileService { case PUBLIC_BUCKET://公有桶 - 永久链接,例如 http://xxx.png String url = this.fileManager.fetchDownloadUrl(bucketName, tgtFileKey, channelCode);//item.getBucketName() item.getChannelCode() return SignUrlDownloadResponse.builder() - .signUrl(this.buildPublicXImageProcess(url, null)) + .signUrl(this.fileManager.buildPublicXImageProcess(url, null)) .fileKey(fileUuid)//item.getFileUuid() .build(); case PRIVATE_BUCKET://私有桶 - 临时授权链接 例如 http://xxx.png?Expire=a&AccessKeyId=b&Signature=c&repsonse-content-disposition=d