From d5c56fd885e6851709b50bffdcd25fa07c47ecd4 Mon Sep 17 00:00:00 2001 From: xudawei Date: Fri, 26 Apr 2024 11:28:20 +0800 Subject: [PATCH 01/20] =?UTF-8?q?=E5=8A=A0=E4=B8=8A=E9=80=9A=E8=BF=87url?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ServerFileController.java | 20 ++ .../oss/common/enums/ChannelTypeEnum.java | 10 +- .../oss/http/api/ServerFileServiceApi.java | 9 + .../model/ServerFileUploadByUrlRequest.java | 31 ++ .../oss/integration/s3/AliOssService.java | 5 + .../integration/s3/HuaWeiCloudService.java | 5 + .../s3/impl/AliOssServiceImpl.java | 25 ++ .../s3/impl/HuaWeiCloudServiceImpl.java | 25 ++ .../cn/axzo/oss/manager/api/FileManager.java | 6 + .../dto/request/ServerFileUploadByUrlDto.java | 28 ++ .../oss/manager/impl/FileManagerImpl.java | 22 ++ .../oss/service/api/FileByUrlService.java | 41 +++ .../service/impl/FileByUrlServiceImpl.java | 308 ++++++++++++++++++ 13 files changed, 534 insertions(+), 1 deletion(-) create mode 100644 oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileUploadByUrlRequest.java create mode 100644 oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileUploadByUrlDto.java create mode 100644 oss-service-api/src/main/java/cn/axzo/oss/service/api/FileByUrlService.java create mode 100644 oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.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 174d3e3..f8af4a6 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,15 +14,18 @@ import cn.axzo.oss.http.model.FindFileKeyResponse; import cn.axzo.oss.http.model.FindFileUrlRequest; import cn.axzo.oss.http.model.FindFileUrlResponse; import cn.axzo.oss.http.model.ServerFileDeleteRequest; +import cn.axzo.oss.http.model.ServerFileUploadByUrlRequest; import cn.axzo.oss.http.model.ServerFileUploadRequest; 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.ServerFileDeleteDto; +import cn.axzo.oss.manager.api.dto.request.ServerFileUploadByUrlDto; import cn.axzo.oss.manager.api.dto.request.ServerFileUploadDto; import cn.axzo.oss.manager.api.dto.request.SignUrlDownloadDto; import cn.axzo.oss.manager.api.dto.request.SignUrlUploadDto; +import cn.axzo.oss.service.api.FileByUrlService; import cn.axzo.oss.service.api.FileService; import cn.azxo.framework.common.model.CommonResponse; import cn.hutool.json.JSONUtil; @@ -47,6 +50,9 @@ public class ServerFileController implements ServerFileServiceApi { @Autowired private FileService fileService; + @Autowired + private FileByUrlService fileByUrlService; + @Autowired private HttpServletRequest httpServletRequest; @@ -127,4 +133,18 @@ public class ServerFileController implements ServerFileServiceApi { ContextInfo.LiteSaasContext liteSaasContext = JSONUtil.toBean(contextInfoLiteJsonStr, ContextInfo.LiteSaasContext.class); return CommonResponse.success(BeanConverter.convert(fileService.signUrlUpload(dto, liteSaasContext), ApiSignUrlUploadResponse.class)); } + + /** + * 通过URL上传文件 + * @param request + * @return + */ + @Override + public CommonResponse uploadByUrl(@Valid @RequestBody ServerFileUploadByUrlRequest request) { + ServerFileUploadByUrlDto dto = BeanConvertUtil.copyBean(request, ServerFileUploadByUrlDto.class); + // 获取feign调用请求头携带的用户信息 + String contextInfoLiteJsonStr = httpServletRequest.getHeader("X-CONTEXT-INFO-LITE"); + 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(), liteSaasContext), ServerFileUploadResponse.class)); + } } diff --git a/oss-common/src/main/java/cn/axzo/oss/common/enums/ChannelTypeEnum.java b/oss-common/src/main/java/cn/axzo/oss/common/enums/ChannelTypeEnum.java index 8e2617e..5900d53 100644 --- a/oss-common/src/main/java/cn/axzo/oss/common/enums/ChannelTypeEnum.java +++ b/oss-common/src/main/java/cn/axzo/oss/common/enums/ChannelTypeEnum.java @@ -26,6 +26,7 @@ public enum ChannelTypeEnum { private final String channelCode; private final static Map channelCodeMap = Arrays.stream(ChannelTypeEnum.values()).collect(Collectors.toMap(ChannelTypeEnum::getChannelCode, Function.identity())); + private final static Map codeMap = Arrays.stream(ChannelTypeEnum.values()).collect(Collectors.toMap(ChannelTypeEnum::getCode, Function.identity())); ChannelTypeEnum(Integer code, String message, String channelCode) { this.code = code; @@ -45,9 +46,16 @@ public enum ChannelTypeEnum { } /** - * 通过code获取枚举 + * 通过channelCode获取枚举 */ public static ChannelTypeEnum getChannelTypeByChannelCode(String channelCode) { return channelCodeMap.get(channelCode); } + + /** + * 通过code获取枚举 + */ + public static ChannelTypeEnum getChannelTypeByCode(Integer code) { + return codeMap.get(code); + } } 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 158b3c7..703d856 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 @@ -10,6 +10,7 @@ import cn.axzo.oss.http.model.FindFileKeyResponse; import cn.axzo.oss.http.model.FindFileUrlRequest; import cn.axzo.oss.http.model.FindFileUrlResponse; import cn.axzo.oss.http.model.ServerFileDeleteRequest; +import cn.axzo.oss.http.model.ServerFileUploadByUrlRequest; import cn.axzo.oss.http.model.ServerFileUploadRequest; import cn.axzo.oss.http.model.ServerFileUploadResponse; import cn.axzo.oss.http.model.ServerFileUploadV2Request; @@ -82,4 +83,12 @@ public interface ServerFileServiceApi { @RequestMapping(value = "api/signUrl/fetchUpload", method = RequestMethod.POST) CommonResponse signUrlFetchUpload(ApiSignUrlUploadRequest request); + /** + * 通过URL上传文件 + * @param request + * @return + */ + @RequestMapping(value = "/api/v1/server/uploadByUrl", method = RequestMethod.POST) + CommonResponse uploadByUrl(ServerFileUploadByUrlRequest request); + } diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileUploadByUrlRequest.java b/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileUploadByUrlRequest.java new file mode 100644 index 0000000..db0d180 --- /dev/null +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileUploadByUrlRequest.java @@ -0,0 +1,31 @@ +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; + +/** + * 服务端文件上传请求类 + * + * @author zhaoyong + * @see ServerFileUploadByUrlRequest + * @since 2021-07-23 10:35 + */ +@Data +public class ServerFileUploadByUrlRequest { + + @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") + @Length(max = 128, message = "文件名不能超过128个字符") + private String fileName; + @NotNull(message = "fileUrl must not be null") + private String fileUrl; + + private Integer channelCode; + +} diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/AliOssService.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/AliOssService.java index bfbbf05..5bfaab7 100644 --- a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/AliOssService.java +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/AliOssService.java @@ -29,4 +29,9 @@ public interface AliOssService extends BaseS3Service { * 获取url */ String getUrl(String bucketName, String tgtFileKey); + + /** + * 通过url上传至OBS + */ + String uploadByUrl(String bucketName, String tgtFileKey, String fileName, String url); } diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/HuaWeiCloudService.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/HuaWeiCloudService.java index 01cbc0b..ecef9b3 100644 --- a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/HuaWeiCloudService.java +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/HuaWeiCloudService.java @@ -40,4 +40,9 @@ public interface HuaWeiCloudService { * 获取url */ String getUrl(String bucketName, String tgtFileKey); + + /** + * 通过url上传OBS + */ + String uploadFileByUrl(String bucketName, String key, String fileName, String url); } 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 c030a3d..685d9e4 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 @@ -359,4 +359,29 @@ public class AliOssServiceImpl implements AliOssService { throw new BizException(CodeEnum.DELETE_FILE_FAIL); } } + + /** + * 通过url上传至OSS + */ + @Override + public String uploadByUrl(String bucketName, String tgtFileKey, String fileName, String url) { + OSS client = aliOssClient.getClient(); + try { + InputStream srcStream = new URL(url).openStream(); + // 创建上传文件的元信息,通过文件云信息设置HTTP Header + ObjectMetadata metadata = new ObjectMetadata(); + // 设置内容被下载时的名称 + metadata.setContentDisposition("attachment;filename=\"" + URLEncoder.encode(fileName, "utf-8") + "\""); + metadata.setContentEncoding("utf-8"); + client.putObject(bucketName, tgtFileKey, srcStream, metadata); + } catch (OSSException e) { + LogUtil.error("uploadByStream OSSException", e); + return ""; + } catch (Exception e) { + LogUtil.error("uploadByStream ClientException", e); + return ""; + } + + return getUrl(bucketName, tgtFileKey); + } } diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java index ffc0909..c9d20d0 100644 --- a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java @@ -19,6 +19,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.InputStream; +import java.net.URL; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Date; @@ -403,4 +404,28 @@ public class HuaWeiCloudServiceImpl implements HuaWeiCloudService { return allBuilder.toString(); } + + /** + * 通过URL上传文件到OBS + */ + @Override + public String uploadFileByUrl(String bucketName, String key, String fileName, String url) { + ObsClient obsClient = huaWeiCloudObsClient.getClient(); + try { + InputStream srcStream = new URL(url).openStream(); + // 创建上传文件的元信息,通过文件云信息设置HTTP Header + ObjectMetadata metadata = new ObjectMetadata(); + // 设置内容被下载时的名称 + metadata.setContentDisposition("attachment;filename=\"" + URLEncoder.encode(fileName, "utf-8") + "\""); + metadata.setContentEncoding("utf-8"); + PutObjectResult putObjectResult = obsClient.putObject(bucketName, key, srcStream, metadata); + return putObjectResult.getObjectUrl(); + } catch (Exception e) { + log.error("通过url上传 exception,bucketName:{}, key:{}, fileName:{},url:{}", bucketName, key, fileName, url); + return ""; + } + + + } + } 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 02c8d16..0c43d3a 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 @@ -75,4 +75,10 @@ public interface FileManager { * 根据华为云/阿里云,授权给第三方下载 */ String fetchDownloadUrl(String bucketName, String key, String channelCode); + + /** + * 通过url上传至云 + */ + String uploadByUrl(String bulkName, String keyPath, String fileName, String url, + Integer channelType); } diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileUploadByUrlDto.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileUploadByUrlDto.java new file mode 100644 index 0000000..737557a --- /dev/null +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileUploadByUrlDto.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; +import lombok.ToString; + +/** + * @program: oss + * @description: 文件上传 + * @author: mr.jie + * @date: 2021-07-29 18:31 + **/ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ToString +public class ServerFileUploadByUrlDto { + private String appCode; + private String bizScene; + private String fileName; + private String fileUrl; + private String filePath; + private Integer channelCode; + +} 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 7cacd2b..c997925 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 @@ -252,4 +252,26 @@ public class FileManagerImpl implements FileManager { } return StringUtils.EMPTY; } + + /** + * 通过url上传至云 + */ + public String uploadByUrl(String bulkName, String keyPath, String fileName, String url, + Integer channelType) { + try { + switch (ChannelTypeEnum.getChannelTypeByCode(channelType)) { + case OSS: + return aliOssService.uploadByUrl(bulkName,keyPath, fileName, url); + case OBS: + return huaWeiCloudService.uploadFileByUrl(bulkName, keyPath, fileName, url); + default: + BizException.error(CodeEnum.CHANNEL_TYPE_NOT_EXIST); + } + } catch (Exception e) { + log.error("通过url上传至云 exception,bulkName:{}, key:{}, fileName:{}, url:{},channelType:{}" + , bulkName, keyPath, fileName, url, channelType, e); + } + return StringUtils.EMPTY; + } + } diff --git a/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileByUrlService.java b/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileByUrlService.java new file mode 100644 index 0000000..c82d2cf --- /dev/null +++ b/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileByUrlService.java @@ -0,0 +1,41 @@ +package cn.axzo.oss.service.api; + +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.MultipartUploadCompleteDto; +import cn.axzo.oss.manager.api.dto.request.MultipartUploadDto; +import cn.axzo.oss.manager.api.dto.request.MultipartUploadFileDto; +import cn.axzo.oss.manager.api.dto.request.MultipartUploadInitDto; +import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; +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.request.SignUrlDownloadDto; +import cn.axzo.oss.manager.api.dto.request.SignUrlUploadDto; +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.MultipartUploadInitResponse; +import cn.axzo.oss.manager.api.dto.response.MultipartUploadResponse; +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.multipart.MultipartFile; + +import java.util.List; + +/** + * @Author admin + * @Description + * @Date 2021/7/28 22:48 + * @Version 0.0.1 + **/ +public interface FileByUrlService { + + /** + * 上传-通过url + */ + ServerFileUploadResponse uploadByUrl(String appCode, String bizScene, String fileName, String url,Integer channelType, ContextInfo.LiteSaasContext liteSaasContext); +} diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java new file mode 100644 index 0000000..1721be0 --- /dev/null +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java @@ -0,0 +1,308 @@ +package cn.axzo.oss.service.impl; + +import cn.axzo.framework.auth.domain.ContextInfo; +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; +import cn.axzo.oss.common.enums.BucketTypeEnum; +import cn.axzo.oss.common.enums.ChannelTypeEnum; +import cn.axzo.oss.common.enums.CodeEnum; +import cn.axzo.oss.common.enums.FileClassEnum; +import cn.axzo.oss.common.enums.FileDownloadTypeEnum; +import cn.axzo.oss.common.enums.FileStatusEnum; +import cn.axzo.oss.common.enums.FileUploadTypeEnum; +import cn.axzo.oss.common.exception.BizException; +import cn.axzo.oss.common.utils.JsonUtil; +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.FileApp; +import cn.axzo.oss.dal.entity.FileBusinessScene; +import cn.axzo.oss.dal.entity.FileUploadConfig; +import cn.axzo.oss.dal.repository.FileAppDao; +import cn.axzo.oss.dal.repository.FileDao; +import cn.axzo.oss.integration.s3.config.HuaWeiCloudObsConfig; +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.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.MultipartUploadCompleteDto; +import cn.axzo.oss.manager.api.dto.request.MultipartUploadDto; +import cn.axzo.oss.manager.api.dto.request.MultipartUploadFileDto; +import cn.axzo.oss.manager.api.dto.request.MultipartUploadInitDto; +import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; +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.request.SignUrlDownloadDto; +import cn.axzo.oss.manager.api.dto.request.SignUrlUploadDto; +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.MultipartUploadInitResponse; +import cn.axzo.oss.manager.api.dto.response.MultipartUploadResponse; +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 cn.axzo.oss.manager.api.vo.SignUrlUploadVo; +import cn.axzo.oss.service.api.FileByUrlService; +import cn.axzo.oss.service.api.FileService; +import cn.hutool.core.collection.CollectionUtil; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +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.multipart.MultipartFile; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; + +import static cn.axzo.oss.common.constans.CommonConstants.APP_PRO_BUCKET_NAME; + +/** + * @Author admin + * @Description + * @Date 2021/7/28 22:48 + * @Version 0.0.1 + **/ +@Service +@RefreshScope +@Slf4j +public class FileByUrlServiceImpl implements FileByUrlService { + + private static final String FILE_UPLOAD_CODE = "OSS_FILE_UPLOAD"; + private static final String FILE_UPLOAD_NAME = "文件上传"; + + @Autowired + private FileDao fileDao; + + @Autowired + private FileManager fileManager; + + @Autowired + private FileAppDao fileAppDao; + + @Autowired + private AppChannelBucketManager appChannelBucketManager; + + @Autowired + private FileBusinessSceneManager fileBusinessSceneManager; + + @Autowired + private FileUploadConfigManager fileUploadConfigManager; + + @Autowired + private Environment environment; + + @Autowired + private LogPlatClient logPlatClient; + + /** + * 通过url上传 + */ + @Override + public ServerFileUploadResponse uploadByUrl(String appCode, String bizScene, String fileName, String url, Integer channelType, ContextInfo.LiteSaasContext liteSaasContext) { + File ossFile = uploadFileAndGetFile(appCode, bizScene, fileName, url, channelType); + //操作日志记录 + operateLog(this.buildUploadParams(appCode, bizScene, fileName, url, channelType), "", FILE_UPLOAD_CODE, FILE_UPLOAD_NAME, liteSaasContext); + return buildResponse(ossFile); + } + + /** + * 操作日志记录 + */ + 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; + } + //记录日志 + try { + OperateLogReq log = OperateLogReq.builder() + .serviceName(StringUtils.isNotEmpty(serviceName) ? serviceName : environment.getProperty("spring.application.name")) + .featureCode(featureCode) + .featureName(featureName) + .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(String appCode, String bizScene, String fileName, String url, Integer channelType) { + log.info("update channelType:{}, fileName:{}, appCode:{}, bizScene:{}", + channelType, fileName, appCode, bizScene); + + FileUploadConfig fileUploadConfig = getFileUploadConfig(appCode, bizScene, channelType); + + // 上传文件并生成file对象 + return generateFile(fileUploadConfig, appCode, fileName,url, channelType); + } + + /** + * 获取配置信息 + */ + private FileUploadConfig getFileUploadConfig(String appCode, String bizScene, Integer channelType) { + // 检查appCode + checkAppCode(appCode); + + // 通过appcode获取文件渠道桶信息 + AppChannelBucket appChannelBucket = appChannelBucketManager.getByAppCode(appCode, channelType); + + // 通过渠道桶编码获取到具体文件业务场景 + FileBusinessScene scene = fileBusinessSceneManager + .getByBucketNoAndScene(appChannelBucket.getAppChannelBucketNo(), bizScene); + + // 通过渠道码和桶名称获取获取指定上传配置 + FileUploadConfig fileUploadConfig = fileUploadConfigManager + .getByUploadConfig(scene.getAppChannelBucketNo(), scene.getDirectory()); + return fileUploadConfig; + } + + /** + * 检查appCode是否有效 + * + * @param appCode + */ + private void checkAppCode(final String appCode) { + log.info("checkAppCode appCode = {}", appCode); + FileApp fileApp = fileAppDao.getByAppCode(appCode); + BizException.error(Utility.objIsNotNull(fileApp), CodeEnum.FILE_APP_IS_EMPTY); + } + + /** + * 生产File对象 + */ + private File generateFile(FileUploadConfig fileUploadConfig, String appCode, String fileName, String url, Integer channelType) { + + // 判断容量 + String fileConform = isFileConform(fileUploadConfig, fileName); + String uuid = Utility.getUUID(); + // 生成上传文件的唯一key + String tgtFileKey = Utility.generateFileKey(fileUploadConfig.getDirectory(), uuid, fileConform); + // 上传文件 + String fileUrl = fileManager.uploadByUrl(fileUploadConfig.getBucketName(), tgtFileKey, fileName, url, channelType); + + // 保存失败 + if (Utility.isBlank(fileUrl)) { + log.error("fileUrl is empty"); + throw new BizException(CodeEnum.FILE_UPLOAD_FAILED); + } + + File file = rebuildOssFile(fileUploadConfig, fileName, fileConform, uuid, fileUrl, Utility.getMd5(url)); + fileDao.save(file); + return file; + } + + /** + * + * @param fileUploadConfig + * @param fileName + * @param fileConform + * @param uuid + * @param fileUrl + * @param fileMd5 + * @return + */ + private File rebuildOssFile(FileUploadConfig fileUploadConfig, String fileName, String fileConform, String uuid, + String fileUrl, String fileMd5) { + 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); + return ossFile; + } + + /** + * 判断文件是否符合要求 + */ + private String isFileConform(FileUploadConfig fileUploadConfig, String fileName) { + // 文件格式判断 + String[] formats = fileUploadConfig.getFileFormat().split(FileClassEnum.COMMA.type); + + int lastIndexOf = fileName.lastIndexOf(FileClassEnum.DOT.type); + BizException + .error(lastIndexOf != CommonConstants.NOT_FOUND_INDEX_OF, CodeEnum.NOT_FILE_FORMAT); + + // 是否包含指定格式 + String fileFormat = fileName.substring(lastIndexOf + CommonConstants.ONE).toLowerCase(); + boolean contains = Arrays.asList(formats).contains(fileFormat); + BizException.error(contains, CodeEnum.FILE_FORMAT_NOT_SUPPORTED); + + return fileFormat; + } + + /** + * 构建操作日志入参 + */ + private String buildUploadParams(String appCode, String bizScene, String fileName, String url,Integer channelType) { + StringBuilder builder = new StringBuilder("appCode:"); + builder.append(appCode).append(";"); + builder.append("bizScene").append(":"); + builder.append(bizScene).append(";"); + builder.append("fileName").append(":"); + builder.append(fileName).append(";"); + builder.append("url").append(":"); + builder.append(url).append(";"); + builder.append("channelType").append(""); + builder.append(channelType).append(";"); + return builder.toString(); + } + + /** + * 构建返回对象 + */ + private ServerFileUploadResponse buildResponse(File ossFile) { + ServerFileUploadResponse response = new ServerFileUploadResponse(); + response.setUrl(ossFile.getFileUrl()); + response.setUrlMd5(ossFile.getUrlMd5()); + response.setFileKey(ossFile.getFileUuid()); + return response; + } +} From dbfb8c8c9903f93d1d1f0bae8568434a5a45af37 Mon Sep 17 00:00:00 2001 From: xudawei Date: Fri, 26 Apr 2024 13:46:15 +0800 Subject: [PATCH 02/20] =?UTF-8?q?=E5=8A=A0=E4=B8=8A=E9=80=9A=E8=BF=87url?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6-=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E6=9E=84=E5=BB=BAhttp=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/FileByUrlServiceImpl.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java index 1721be0..14d08c0 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java @@ -122,17 +122,38 @@ public class FileByUrlServiceImpl implements FileByUrlService { @Autowired private LogPlatClient logPlatClient; + @Autowired + private FileService fileService; + /** * 通过url上传 */ @Override public ServerFileUploadResponse uploadByUrl(String appCode, String bizScene, String fileName, String url, Integer channelType, ContextInfo.LiteSaasContext liteSaasContext) { + //重新构建链接 + url = this.rebuildUrl(url); File ossFile = uploadFileAndGetFile(appCode, bizScene, fileName, url, channelType); //操作日志记录 operateLog(this.buildUploadParams(appCode, bizScene, fileName, url, channelType), "", FILE_UPLOAD_CODE, FILE_UPLOAD_NAME, liteSaasContext); return buildResponse(ossFile); } + /** + * url:https://xxx,则直接返回 + * url:fileKey,则返回https://链接 + */ + private String rebuildUrl(String url) { + if (StringUtils.isNotBlank(url)) { + FindFileUrlDto findFileUrlDto = FindFileUrlDto.builder().fileKey(Lists.newArrayList(url)).build(); + + List responseList = fileService.findFileUrl(findFileUrlDto); + if (CollectionUtil.isNotEmpty(responseList)) { + return responseList.get(0).getUrl(); + } + } + return StringUtils.EMPTY; + } + /** * 操作日志记录 */ From d1212e402bdc6b3c50a615723cb0c6d6b9959f04 Mon Sep 17 00:00:00 2001 From: xudawei Date: Fri, 26 Apr 2024 16:30:30 +0800 Subject: [PATCH 03/20] =?UTF-8?q?=E5=8A=A0=E4=B8=8A=E9=80=9A=E8=BF=87url?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6-channelType=E6=9B=B4?= =?UTF-8?q?=E6=8D=A2channelCode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/axzo/oss/manager/api/FileManager.java | 2 +- .../java/cn/axzo/oss/manager/impl/FileManagerImpl.java | 8 ++++---- .../cn/axzo/oss/service/impl/FileByUrlServiceImpl.java | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java index 0c43d3a..95b1d5b 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 @@ -80,5 +80,5 @@ public interface FileManager { * 通过url上传至云 */ String uploadByUrl(String bulkName, String keyPath, String fileName, String url, - Integer channelType); + String channelCode); } 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 c997925..60b05cd 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 @@ -257,9 +257,9 @@ public class FileManagerImpl implements FileManager { * 通过url上传至云 */ public String uploadByUrl(String bulkName, String keyPath, String fileName, String url, - Integer channelType) { + String channelCode) { try { - switch (ChannelTypeEnum.getChannelTypeByCode(channelType)) { + switch (ChannelTypeEnum.getChannelTypeByChannelCode(channelCode)) { case OSS: return aliOssService.uploadByUrl(bulkName,keyPath, fileName, url); case OBS: @@ -268,8 +268,8 @@ public class FileManagerImpl implements FileManager { BizException.error(CodeEnum.CHANNEL_TYPE_NOT_EXIST); } } catch (Exception e) { - log.error("通过url上传至云 exception,bulkName:{}, key:{}, fileName:{}, url:{},channelType:{}" - , bulkName, keyPath, fileName, url, channelType, e); + log.error("通过url上传至云 exception,bulkName:{}, key:{}, fileName:{}, url:{},channelCode:{}" + , bulkName, keyPath, fileName, url, channelCode, e); } return StringUtils.EMPTY; } diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java index 14d08c0..90759a2 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java @@ -191,7 +191,7 @@ public class FileByUrlServiceImpl implements FileByUrlService { FileUploadConfig fileUploadConfig = getFileUploadConfig(appCode, bizScene, channelType); // 上传文件并生成file对象 - return generateFile(fileUploadConfig, appCode, fileName,url, channelType); + return generateFile(fileUploadConfig, fileName,url, fileUploadConfig.getChannelCode()); } /** @@ -228,7 +228,7 @@ public class FileByUrlServiceImpl implements FileByUrlService { /** * 生产File对象 */ - private File generateFile(FileUploadConfig fileUploadConfig, String appCode, String fileName, String url, Integer channelType) { + private File generateFile(FileUploadConfig fileUploadConfig, String fileName, String url, String channelCode) { // 判断容量 String fileConform = isFileConform(fileUploadConfig, fileName); @@ -236,7 +236,7 @@ public class FileByUrlServiceImpl implements FileByUrlService { // 生成上传文件的唯一key String tgtFileKey = Utility.generateFileKey(fileUploadConfig.getDirectory(), uuid, fileConform); // 上传文件 - String fileUrl = fileManager.uploadByUrl(fileUploadConfig.getBucketName(), tgtFileKey, fileName, url, channelType); + String fileUrl = fileManager.uploadByUrl(fileUploadConfig.getBucketName(), tgtFileKey, fileName, url, channelCode); // 保存失败 if (Utility.isBlank(fileUrl)) { From c618aec98a7952baafa763ca8a0ca2b09fb0aeaf Mon Sep 17 00:00:00 2001 From: xudawei Date: Sun, 28 Apr 2024 15:52:42 +0800 Subject: [PATCH 04/20] =?UTF-8?q?=E5=8A=A0=E4=B8=8A=E9=80=9A=E8=BF=87url?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6-=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E4=B8=8B=E8=BD=BDurl=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/FileByUrlServiceImpl.java | 54 ++++++++++++------- .../oss/service/impl/FileServiceImpl.java | 4 +- 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java index 90759a2..6678147 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java @@ -125,17 +125,25 @@ public class FileByUrlServiceImpl implements FileByUrlService { @Autowired private FileService fileService; + @Value("${sign.url.download.expire.second:2000}") + private Long SIGN_URL_DOWNLOAD_EXPIRE_SECOND; + /** * 通过url上传 */ @Override public ServerFileUploadResponse uploadByUrl(String appCode, String bizScene, String fileName, String url, Integer channelType, ContextInfo.LiteSaasContext liteSaasContext) { + log.info("uploadByUrl params,appCode:{},bizScene:{}, fileName:{},url:{},channelType:{}", appCode, bizScene, fileName, url, channelType); + Long start = System.currentTimeMillis(); //重新构建链接 url = this.rebuildUrl(url); File ossFile = uploadFileAndGetFile(appCode, bizScene, fileName, url, channelType); //操作日志记录 operateLog(this.buildUploadParams(appCode, bizScene, fileName, url, channelType), "", FILE_UPLOAD_CODE, FILE_UPLOAD_NAME, liteSaasContext); - return buildResponse(ossFile); + ServerFileUploadResponse response = this.buildResponse(ossFile); + log.info("uploadByUrl result,appCode:{},bizScene:{}, fileName:{},url:{},channelType:{}, response:{},times:{}" + , appCode, bizScene, fileName, url, channelType, JsonUtil.obj2Str(response), System.currentTimeMillis() - start); + return response; } /** @@ -188,16 +196,6 @@ public class FileByUrlServiceImpl implements FileByUrlService { log.info("update channelType:{}, fileName:{}, appCode:{}, bizScene:{}", channelType, fileName, appCode, bizScene); - FileUploadConfig fileUploadConfig = getFileUploadConfig(appCode, bizScene, channelType); - - // 上传文件并生成file对象 - return generateFile(fileUploadConfig, fileName,url, fileUploadConfig.getChannelCode()); - } - - /** - * 获取配置信息 - */ - private FileUploadConfig getFileUploadConfig(String appCode, String bizScene, Integer channelType) { // 检查appCode checkAppCode(appCode); @@ -211,7 +209,9 @@ public class FileByUrlServiceImpl implements FileByUrlService { // 通过渠道码和桶名称获取获取指定上传配置 FileUploadConfig fileUploadConfig = fileUploadConfigManager .getByUploadConfig(scene.getAppChannelBucketNo(), scene.getDirectory()); - return fileUploadConfig; + + // 上传文件并生成file对象 + return generateFile(fileUploadConfig, fileName,url, fileUploadConfig.getChannelCode(), appChannelBucket.getBucketType(), scene.getDownloadExpiration()); } /** @@ -228,8 +228,7 @@ public class FileByUrlServiceImpl implements FileByUrlService { /** * 生产File对象 */ - private File generateFile(FileUploadConfig fileUploadConfig, String fileName, String url, String channelCode) { - + private File generateFile(FileUploadConfig fileUploadConfig, String fileName, String url, String channelCode, String bucketType, Long expire) { // 判断容量 String fileConform = isFileConform(fileUploadConfig, fileName); String uuid = Utility.getUUID(); @@ -237,18 +236,37 @@ public class FileByUrlServiceImpl implements FileByUrlService { String tgtFileKey = Utility.generateFileKey(fileUploadConfig.getDirectory(), uuid, fileConform); // 上传文件 String fileUrl = fileManager.uploadByUrl(fileUploadConfig.getBucketName(), tgtFileKey, fileName, url, channelCode); + //重新构建fileUrl + fileUrl = rebuildFileUrl(fileUploadConfig, fileName, channelCode, bucketType, expire, tgtFileKey, fileUrl); + + File file = rebuildOssFile(fileUploadConfig, fileName, fileConform, uuid, fileUrl, Utility.getMd5(url)); + fileDao.save(file); + return file; + } + + /** + * 重新构建fileUrl + */ + private String rebuildFileUrl(FileUploadConfig fileUploadConfig, String fileName, String channelCode, String bucketType, Long expire, String tgtFileKey, String fileUrl) { + switch (BucketTypeEnum.getByCode(bucketType)) { + case PUBLIC_BUCKET: + fileUrl = this.fileManager.fetchDownloadUrl(fileUploadConfig.getBucketName(), tgtFileKey, channelCode); + break; + case PRIVATE_BUCKET: + fileUrl = this.fileManager.signUrlDownload(fileUploadConfig.getBucketName(), tgtFileKey, Objects.nonNull(expire) ? expire : SIGN_URL_DOWNLOAD_EXPIRE_SECOND , channelCode, fileName); + default: + BizException.error(CodeEnum.CHANNEL_TYPE_NOT_EXIST); + } // 保存失败 if (Utility.isBlank(fileUrl)) { log.error("fileUrl is empty"); throw new BizException(CodeEnum.FILE_UPLOAD_FAILED); } - - File file = rebuildOssFile(fileUploadConfig, fileName, fileConform, uuid, fileUrl, Utility.getMd5(url)); - fileDao.save(file); - return file; + return fileUrl; } + /** * * @param fileUploadConfig 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 850b12a..e5b4879 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 @@ -867,7 +867,7 @@ public class FileServiceImpl implements FileService { } return SignUrlDownloadResponse.builder().build(); }).collect(Collectors.toList()); - log.info("signUrl download end dto = {}, times:{}", JsonUtil.obj2Str(dto), System.currentTimeMillis() - start); + log.info("signUrl download end dto = {},responseList:{}, times:{}", JsonUtil.obj2Str(dto), JsonUtil.obj2Str(responseList), System.currentTimeMillis() - start); return responseList; } @@ -911,7 +911,7 @@ 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); - log.info("signUrl upload dto = {}, times:{}", JsonUtil.obj2Str(dto), System.currentTimeMillis() - start); + log.info("signUrl upload dto = {},response:{}, times:{}", JsonUtil.obj2Str(dto), JsonUtil.obj2Str(response),System.currentTimeMillis() - start); return response; } From 0c338c4c230e7fcc9c52689caabbe03726bb4ccf Mon Sep 17 00:00:00 2001 From: xudawei Date: Tue, 30 Apr 2024 14:55:28 +0800 Subject: [PATCH 05/20] =?UTF-8?q?=E5=8A=A0=E4=B8=8A=E9=80=9A=E8=BF=87url?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6-=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E9=93=BE=E6=8E=A5=E5=8A=A0=E4=B8=8A=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java index 6678147..8320cd2 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java @@ -254,6 +254,7 @@ public class FileByUrlServiceImpl implements FileByUrlService { break; case PRIVATE_BUCKET: fileUrl = this.fileManager.signUrlDownload(fileUploadConfig.getBucketName(), tgtFileKey, Objects.nonNull(expire) ? expire : SIGN_URL_DOWNLOAD_EXPIRE_SECOND , channelCode, fileName); + break; default: BizException.error(CodeEnum.CHANNEL_TYPE_NOT_EXIST); } From cd7d28ebd507d3c8132067d1dcda4c017ddf5e37 Mon Sep 17 00:00:00 2001 From: xudawei Date: Thu, 9 May 2024 11:06:50 +0800 Subject: [PATCH 06/20] =?UTF-8?q?=E5=8D=8E=E4=B8=BA=E4=BA=91=E4=B8=B4?= =?UTF-8?q?=E6=97=B6=E6=8E=88=E6=9D=83=E5=8A=A0=E4=B8=8Astyle=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/oss/http/model/ApiSignUrlDownloadRequest.java | 5 +++++ .../java/cn/axzo/oss/integration/s3/HuaWeiCloudService.java | 2 +- .../oss/integration/s3/impl/HuaWeiCloudServiceImpl.java | 6 +++++- .../src/main/java/cn/axzo/oss/manager/api/FileManager.java | 2 +- .../oss/manager/api/dto/request/SignUrlDownloadDto.java | 5 +++++ .../main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java | 6 +++--- .../java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java | 2 +- .../main/java/cn/axzo/oss/service/impl/FileServiceImpl.java | 4 ++-- 8 files changed, 23 insertions(+), 9 deletions(-) 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 a2b7792..8c5b34a 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,4 +32,9 @@ public class ApiSignUrlDownloadRequest { */ private String bizScene; + /** + * 图片样式,比如x-oss-process=image/auto-orient,1/resize,p_50/quality,q_30 + */ + private String style; + } diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/HuaWeiCloudService.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/HuaWeiCloudService.java index ecef9b3..d6f3bc8 100644 --- a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/HuaWeiCloudService.java +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/HuaWeiCloudService.java @@ -24,7 +24,7 @@ public interface HuaWeiCloudService { /** * 授权给第三方-下载 */ - String downloadSignUrl(String bucketName, String key, Long expireSecond, String fileName); + String downloadSignUrl(String bucketName, String key, Long expireSecond, String fileName, String style); /** * 授权给第三方-上传 diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java index c9d20d0..f5c8512 100644 --- a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java @@ -17,6 +17,7 @@ import com.obs.services.model.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import java.io.InputStream; import java.net.URL; @@ -332,13 +333,16 @@ public class HuaWeiCloudServiceImpl implements HuaWeiCloudService { * 授权给第三方-下载 */ @Override - public String downloadSignUrl(String bucketName, String key, Long expireSeconds, String fileName) { + public String downloadSignUrl(String bucketName, String key, Long expireSeconds, String fileName, String style) { TemporarySignatureRequest request = new TemporarySignatureRequest(HttpMethodEnum.GET, expireSeconds); request.setBucketName(bucketName); request.setObjectKey(key); Map queryParams = Maps.newHashMap(); try { queryParams.put("response-content-disposition", "attachment;filename=\"" + URLEncoder.encode(fileName, "utf-8") + "\""); + if (StringUtils.hasText(style)) { + queryParams.put("x-image-process", "image/auto-orient,1/resize,p_50/quality,q_30"); + } request.setQueryParams(queryParams); log.info("huawei cloud downloadSignUrl params, bucketName:{}, key:{}, request:{}", bucketName, key, JsonUtil.obj2Str(request)); TemporarySignatureResponse response = huaWeiCloudObsClient.getClient().createTemporarySignature(request); 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 95b1d5b..2b3011a 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 @@ -59,7 +59,7 @@ public interface FileManager { /** * 根据华为云/阿里云,授权给第三方下载 */ - String signUrlDownload(String bucketName, String key, Long expireSecond, String channelCode, String fileName); + String signUrlDownload(String bucketName, String key, Long expireSecond, String channelCode, String fileName, String style); /** * 根据华为云/阿里云,授权给第三方上传 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 757887e..897eae1 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,4 +34,9 @@ public class SignUrlDownloadDto { */ private String bizScene; + /** + * 图片样式,比如x-oss-process=image/auto-orient,1/resize,p_50/quality,q_30 + */ + private String style; + } 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 60b05cd..81a0fe7 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 @@ -148,11 +148,11 @@ public class FileManagerImpl implements FileManager { * 根据华为云/阿里云,授权给第三方下载 */ @Override - public String signUrlDownload(String bucketName, String key, Long expireSecond, String channelCode, String fileName) { + public String signUrlDownload(String bucketName, String key, Long expireSecond, String channelCode, String fileName, String style) { ChannelTypeEnum typeEnum = ChannelTypeEnum.getChannelTypeByChannelCode(channelCode); switch (typeEnum) { case OBS:// 华为云 - return huaWeiCloudService.downloadSignUrl(bucketName, key, expireSecond, fileName); + return huaWeiCloudService.downloadSignUrl(bucketName, key, expireSecond, fileName, style); case OSS:// 阿里云 return aliOssService.downloadSignUrl(bucketName, key, expireSecond, fileName); default: @@ -196,7 +196,7 @@ public class FileManagerImpl implements FileManager { private String downloadHuaweiSignUrl(String bucketName, String key, Long expireSecond, String bucketType, String fileName) { switch (BucketTypeEnum.getByCode(bucketType)) { case PRIVATE_BUCKET: - return huaWeiCloudService.downloadSignUrl(bucketName, key, expireSecond, fileName); + return huaWeiCloudService.downloadSignUrl(bucketName, key, expireSecond, fileName, null); case PUBLIC_BUCKET: return huaWeiCloudService.getUrl(bucketName, key); default: diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java index 8320cd2..c26cbb7 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java @@ -253,7 +253,7 @@ public class FileByUrlServiceImpl implements FileByUrlService { fileUrl = this.fileManager.fetchDownloadUrl(fileUploadConfig.getBucketName(), tgtFileKey, channelCode); break; case PRIVATE_BUCKET: - fileUrl = this.fileManager.signUrlDownload(fileUploadConfig.getBucketName(), tgtFileKey, Objects.nonNull(expire) ? expire : SIGN_URL_DOWNLOAD_EXPIRE_SECOND , channelCode, fileName); + fileUrl = this.fileManager.signUrlDownload(fileUploadConfig.getBucketName(), tgtFileKey, Objects.nonNull(expire) ? expire : SIGN_URL_DOWNLOAD_EXPIRE_SECOND , channelCode, fileName, null); break; default: BizException.error(CodeEnum.CHANNEL_TYPE_NOT_EXIST); 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 e5b4879..f783692 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 @@ -501,7 +501,7 @@ public class FileServiceImpl implements FileService { response.setFileKey(fileKey); if (Objects.nonNull(bucketTypeMap.get(file.getAppChannelBucketNo())) && BucketTypeEnum.PRIVATE_BUCKET.getCode().equals(bucketTypeMap.get(file.getAppChannelBucketNo()))) { String tgtFileKey = Utility.generateFileKey(file.getDirectory(), file.getFileUuid(), file.getFileFormat()); - response.setUrl(fileManager.signUrlDownload(file.getBucketName(), tgtFileKey, SIGN_URL_DOWNLOAD_EXPIRE_SECOND, file.getChannelCode(), file.getFileName())); + response.setUrl(fileManager.signUrlDownload(file.getBucketName(), tgtFileKey, SIGN_URL_DOWNLOAD_EXPIRE_SECOND, file.getChannelCode(), file.getFileName(), null)); } else { response.setUrl(fileUrl); } @@ -857,7 +857,7 @@ public class FileServiceImpl implements FileService { .fileKey(item.getFileUuid()) .build(); case PRIVATE_BUCKET: - String signUrl = this.fileManager.signUrlDownload(item.getBucketName(), tgtFileKey, Objects.nonNull(expire) ? expire : SIGN_URL_DOWNLOAD_EXPIRE_SECOND , item.getChannelCode(), item.getFileName()); + String signUrl = this.fileManager.signUrlDownload(item.getBucketName(), tgtFileKey, Objects.nonNull(expire) ? expire : SIGN_URL_DOWNLOAD_EXPIRE_SECOND , item.getChannelCode(), item.getFileName(), dto.getStyle()); return SignUrlDownloadResponse.builder() .signUrl(UrlUtil.httpToHttps(signUrl)) .fileKey(item.getFileUuid()) From 7d3ef9fee9ab96b0231112cf95ed645e8667bf46 Mon Sep 17 00:00:00 2001 From: xudawei Date: Thu, 9 May 2024 11:21:40 +0800 Subject: [PATCH 07/20] fix-complie-error --- .../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 1b34575..80ab903 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 @@ -942,7 +942,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); + List responseList = this.buildFileKeyResponse(Lists.newArrayList(map.values()), null, null); if (CollectionUtil.isEmpty(responseList)) { return httpUrlList.stream().map(item -> SignUrlDownloadResponse.builder().fileKey(item).signUrl(item).build()).collect(Collectors.toList()); } From ab70de276951a57fe6b236c59abce1c6fe08c4be Mon Sep 17 00:00:00 2001 From: xudawei Date: Fri, 10 May 2024 19:08:17 +0800 Subject: [PATCH 08/20] =?UTF-8?q?=E9=80=9A=E8=BF=87url=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E6=96=87=E4=BB=B6-=E5=8A=A0=E4=B8=8Astyle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oss/client/controller/ServerFileController.java | 2 +- .../oss/http/model/ServerFileUploadByUrlRequest.java | 4 ++++ .../api/dto/request/ServerFileUploadByUrlDto.java | 5 +++++ .../cn/axzo/oss/service/api/FileByUrlService.java | 2 +- .../axzo/oss/service/impl/FileByUrlServiceImpl.java | 12 ++++++------ .../cn/axzo/oss/service/impl/FileServiceImpl.java | 2 +- 6 files changed, 18 insertions(+), 9 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 f8af4a6..fbee8c5 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 @@ -145,6 +145,6 @@ public class ServerFileController implements ServerFileServiceApi { // 获取feign调用请求头携带的用户信息 String contextInfoLiteJsonStr = httpServletRequest.getHeader("X-CONTEXT-INFO-LITE"); 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(), liteSaasContext), ServerFileUploadResponse.class)); + return CommonResponse.success(BeanConverter.convert(fileByUrlService.uploadByUrl(dto.getAppCode(), dto.getBizScene(), dto.getFileName(), dto.getFileUrl(), dto.getChannelCode(), dto.getStyle(), liteSaasContext), ServerFileUploadResponse.class)); } } diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileUploadByUrlRequest.java b/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileUploadByUrlRequest.java index db0d180..7c530c2 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileUploadByUrlRequest.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileUploadByUrlRequest.java @@ -27,5 +27,9 @@ public class ServerFileUploadByUrlRequest { private String fileUrl; private Integer channelCode; + /** + * 图片样式,比如x-oss-process=image/auto-orient,1/resize,p_50/quality,q_30 + */ + private String style; } diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileUploadByUrlDto.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileUploadByUrlDto.java index 737557a..ae07c8a 100644 --- a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileUploadByUrlDto.java +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileUploadByUrlDto.java @@ -25,4 +25,9 @@ public class ServerFileUploadByUrlDto { private String filePath; private Integer channelCode; + /** + * 图片样式,比如x-oss-process=image/auto-orient,1/resize,p_50/quality,q_30 + */ + private String style; + } diff --git a/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileByUrlService.java b/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileByUrlService.java index c82d2cf..8c4b04b 100644 --- a/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileByUrlService.java +++ b/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileByUrlService.java @@ -37,5 +37,5 @@ public interface FileByUrlService { /** * 上传-通过url */ - ServerFileUploadResponse uploadByUrl(String appCode, String bizScene, String fileName, String url,Integer channelType, ContextInfo.LiteSaasContext liteSaasContext); + ServerFileUploadResponse uploadByUrl(String appCode, String bizScene, String fileName, String url,Integer channelType, String style, ContextInfo.LiteSaasContext liteSaasContext); } diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java index c26cbb7..b9cdd3b 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java @@ -132,11 +132,11 @@ public class FileByUrlServiceImpl implements FileByUrlService { * 通过url上传 */ @Override - public ServerFileUploadResponse uploadByUrl(String appCode, String bizScene, String fileName, String url, Integer channelType, ContextInfo.LiteSaasContext liteSaasContext) { + public ServerFileUploadResponse uploadByUrl(String appCode, String bizScene, String fileName, String url, Integer channelType,String style, ContextInfo.LiteSaasContext liteSaasContext) { log.info("uploadByUrl params,appCode:{},bizScene:{}, fileName:{},url:{},channelType:{}", appCode, bizScene, fileName, url, channelType); Long start = System.currentTimeMillis(); //重新构建链接 - url = this.rebuildUrl(url); + url = this.rebuildUrl(url, style); File ossFile = uploadFileAndGetFile(appCode, bizScene, fileName, url, channelType); //操作日志记录 operateLog(this.buildUploadParams(appCode, bizScene, fileName, url, channelType), "", FILE_UPLOAD_CODE, FILE_UPLOAD_NAME, liteSaasContext); @@ -150,13 +150,13 @@ public class FileByUrlServiceImpl implements FileByUrlService { * url:https://xxx,则直接返回 * url:fileKey,则返回https://链接 */ - private String rebuildUrl(String url) { + private String rebuildUrl(String url, String style) { if (StringUtils.isNotBlank(url)) { - FindFileUrlDto findFileUrlDto = FindFileUrlDto.builder().fileKey(Lists.newArrayList(url)).build(); + SignUrlDownloadDto signUrlDownloadDto = SignUrlDownloadDto.builder().fileKeys(Lists.newArrayList(url)).style(style).build(); - List responseList = fileService.findFileUrl(findFileUrlDto); + List responseList = fileService.signUrlDownload(signUrlDownloadDto); if (CollectionUtil.isNotEmpty(responseList)) { - return responseList.get(0).getUrl(); + return responseList.get(0).getSignUrl(); } } return StringUtils.EMPTY; 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 80ab903..0b6457c 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 @@ -942,7 +942,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, null); + List responseList = this.buildFileKeyResponse(Lists.newArrayList(map.values()), null, dto.getStyle()); if (CollectionUtil.isEmpty(responseList)) { return httpUrlList.stream().map(item -> SignUrlDownloadResponse.builder().fileKey(item).signUrl(item).build()).collect(Collectors.toList()); } From fabf67fb535be68f2cfd9ceda50e075683df60bd Mon Sep 17 00:00:00 2001 From: xudawei Date: Sat, 11 May 2024 11:46:31 +0800 Subject: [PATCH 09/20] =?UTF-8?q?=E9=80=9A=E8=BF=87url=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E6=96=87=E4=BB=B6-=E5=85=AC=E5=BC=80=E9=93=BE=E6=8E=A5?= =?UTF-8?q?=E4=B9=9F=E5=8A=A0=E4=B8=8Astyle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/oss/service/impl/FileServiceImpl.java | 12 +++++++++++- 1 file changed, 11 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 0b6457c..96cc4b6 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 @@ -922,11 +922,21 @@ public class FileServiceImpl implements FileService { return Lists.newArrayList(); } return httpUrlList.stream().map(item -> SignUrlDownloadResponse.builder() - .signUrl(item) + .signUrl(item + this.buildPublicXImageProcess(dto.getStyle())) .fileKey(item) .build()).collect(Collectors.toList()); } + /** + * 构建公开Style + */ + private String buildPublicXImageProcess(String style) { + if (StringUtils.isBlank(style)) { + return ""; + } + return "?x-oss-process=" + style; + } + /** * 构建http链接(非fileKey入参)返回对象 */ From 5e05799c3e57e267dfe5d8b97cafe654bb6ba4f4 Mon Sep 17 00:00:00 2001 From: xudawei Date: Tue, 14 May 2024 14:48:09 +0800 Subject: [PATCH 10/20] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=88=96=E8=80=85?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E6=97=B6=EF=BC=8C=E5=8A=A0=E4=B8=8A=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=90=8D=E7=A7=B0=E5=8F=82=E6=95=B0=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oss/integration/s3/AliOssService.java | 2 +- .../integration/s3/HuaWeiCloudService.java | 2 +- .../s3/impl/AliOssServiceImpl.java | 6 ++++-- .../s3/impl/HuaWeiCloudServiceImpl.java | 11 +++++++--- .../cn/axzo/oss/manager/api/FileManager.java | 4 ++-- .../api/dto/request/SignUrlDownloadDto.java | 4 ++++ .../api/dto/request/SignUrlUploadDto.java | 5 +++++ .../oss/manager/impl/FileManagerImpl.java | 20 +++++++++---------- .../service/impl/FileByUrlServiceImpl.java | 2 +- .../oss/service/impl/FileServiceImpl.java | 20 +++++++++++-------- 10 files changed, 48 insertions(+), 28 deletions(-) diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/AliOssService.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/AliOssService.java index 5bfaab7..09e0113 100644 --- a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/AliOssService.java +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/AliOssService.java @@ -13,7 +13,7 @@ public interface AliOssService extends BaseS3Service { /** * 授权给第三方下载 */ - String downloadSignUrl(String bucketName, String key, Long expireSecond, String fileName); + String downloadSignUrl(String bucketName, String key, Long expireSecond, String fileName, boolean hasFileName); /** * 授权给第三方-上传 diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/HuaWeiCloudService.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/HuaWeiCloudService.java index d6f3bc8..4528510 100644 --- a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/HuaWeiCloudService.java +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/HuaWeiCloudService.java @@ -24,7 +24,7 @@ public interface HuaWeiCloudService { /** * 授权给第三方-下载 */ - String downloadSignUrl(String bucketName, String key, Long expireSecond, String fileName, String style); + String downloadSignUrl(String bucketName, String key, Long expireSecond, String fileName, String style, boolean hasFilename); /** * 授权给第三方-上传 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 685d9e4..8a2f7b4 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 @@ -288,7 +288,7 @@ public class AliOssServiceImpl implements AliOssService { * 授权给第三方-下载 */ @Override - public String downloadSignUrl(String bucketName, String key, Long expireSecond, String fileName) { + public String downloadSignUrl(String bucketName, String key, Long expireSecond, String fileName, boolean hasFileName) { Date date = new Date(); date.setTime(date.getTime() + expireSecond * 1000); try { @@ -296,7 +296,9 @@ public class AliOssServiceImpl implements AliOssService { GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, key, HttpMethod.GET); request.setExpiration(date); ResponseHeaderOverrides responseHeaderOverrides = new ResponseHeaderOverrides(); - responseHeaderOverrides.setContentDisposition("attachment;filename=\"" + URLEncoder.encode(fileName, "utf-8") + "\""); + if (hasFileName) { + responseHeaderOverrides.setContentDisposition("attachment;filename=\"" + URLEncoder.encode(fileName, "utf-8") + "\""); + } request.setResponseHeaders(responseHeaderOverrides); URL url = aliOssClient.getClient().generatePresignedUrl(request); log.info("aliyun downloadSignUrl result, bucketName:{}, key:{}, url:{}", bucketName, key, JsonUtil.obj2Str(url)); diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java index f5c8512..2e828c4 100644 --- a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java @@ -17,6 +17,7 @@ import com.obs.services.model.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import java.io.InputStream; @@ -333,17 +334,21 @@ public class HuaWeiCloudServiceImpl implements HuaWeiCloudService { * 授权给第三方-下载 */ @Override - public String downloadSignUrl(String bucketName, String key, Long expireSeconds, String fileName, String style) { + public String downloadSignUrl(String bucketName, String key, Long expireSeconds, String fileName, String style, boolean hasFilename) { TemporarySignatureRequest request = new TemporarySignatureRequest(HttpMethodEnum.GET, expireSeconds); request.setBucketName(bucketName); request.setObjectKey(key); Map queryParams = Maps.newHashMap(); try { - queryParams.put("response-content-disposition", "attachment;filename=\"" + URLEncoder.encode(fileName, "utf-8") + "\""); + if (hasFilename) { + queryParams.put("response-content-disposition", "attachment;filename=\"" + URLEncoder.encode(fileName, "utf-8") + "\""); + } if (StringUtils.hasText(style)) { queryParams.put("x-image-process", "image/auto-orient,1/resize,p_50/quality,q_30"); } - request.setQueryParams(queryParams); + if (!CollectionUtils.isEmpty(queryParams)) { + request.setQueryParams(queryParams); + } log.info("huawei cloud downloadSignUrl params, bucketName:{}, key:{}, request:{}", bucketName, key, JsonUtil.obj2Str(request)); TemporarySignatureResponse response = huaWeiCloudObsClient.getClient().createTemporarySignature(request); log.info("huawei cloud downloadSignUrl result, bucketName:{}, key:{}, request:{}", bucketName, key, JsonUtil.obj2Str(response)); 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 2b3011a..34d2a65 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 @@ -59,12 +59,12 @@ public interface FileManager { /** * 根据华为云/阿里云,授权给第三方下载 */ - String signUrlDownload(String bucketName, String key, Long expireSecond, String channelCode, String fileName, String style); + String signUrlDownload(String bucketName, String key, Long expireSecond, String channelCode, String fileName, String style, boolean hasFileName); /** * 根据华为云/阿里云,授权给第三方上传 */ - SignUrlUploadVo signUrlUpload(String bucketName, String key, String fileName, Long expireSecond, String channelCode, String contentType, String bucketType); + SignUrlUploadVo signUrlUpload(String bucketName, String key, String fileName, Long expireSecond, String channelCode, String contentType, String bucketType, boolean hasFileName); /** * 删除File 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 897eae1..1b40527 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 @@ -38,5 +38,9 @@ public class SignUrlDownloadDto { * 图片样式,比如x-oss-process=image/auto-orient,1/resize,p_50/quality,q_30 */ private String style; + /** + * 是否带上文件名称 + */ + private Boolean hasFileName = true; } 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 52d75d8..5afb663 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 @@ -57,4 +57,9 @@ public class SignUrlUploadDto { * 过期时间 */ private Long expiration; + + /** + * 是否带上文件名称 + */ + private Boolean hasFileName = true; } 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 81a0fe7..14790d9 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 @@ -148,13 +148,13 @@ public class FileManagerImpl implements FileManager { * 根据华为云/阿里云,授权给第三方下载 */ @Override - public String signUrlDownload(String bucketName, String key, Long expireSecond, String channelCode, String fileName, String style) { + public String signUrlDownload(String bucketName, String key, Long expireSecond, String channelCode, String fileName, String style, boolean hasFileName) { ChannelTypeEnum typeEnum = ChannelTypeEnum.getChannelTypeByChannelCode(channelCode); switch (typeEnum) { case OBS:// 华为云 - return huaWeiCloudService.downloadSignUrl(bucketName, key, expireSecond, fileName, style); + return huaWeiCloudService.downloadSignUrl(bucketName, key, expireSecond, fileName, style, hasFileName); case OSS:// 阿里云 - return aliOssService.downloadSignUrl(bucketName, key, expireSecond, fileName); + return aliOssService.downloadSignUrl(bucketName, key, expireSecond, fileName, hasFileName); default: BizException.error(CodeEnum.CHANNEL_TYPE_NOT_EXIST); } @@ -165,7 +165,7 @@ public class FileManagerImpl implements FileManager { * 根据华为云/阿里云,授权给第三方上传 */ @Override - public SignUrlUploadVo signUrlUpload(String bucketName, String key, String fileName, Long expireSecond, String channelCode, String contentType, String bucketType) { + public SignUrlUploadVo signUrlUpload(String bucketName, String key, String fileName, Long expireSecond, String channelCode, String contentType, String bucketType, boolean hasFileName) { ChannelTypeEnum typeEnum = ChannelTypeEnum.getChannelTypeByChannelCode(channelCode); switch (typeEnum) { case OBS:// 华为云 @@ -176,13 +176,13 @@ public class FileManagerImpl implements FileManager { .host(response.getActualSignedRequestHeaders().get(HUAWEI_CLOUD_SIGNURL_UPLOAD_HOST_KEY)) .contentType(response.getActualSignedRequestHeaders().get(HUAWEI_CLOUD_SIGNURL_UPLOAD_CONTENT_TYPE_KEY)) .channelCode(channelCode) - .downloadSignUrl(UrlUtil.httpToHttps(this.downloadHuaweiSignUrl(bucketName, key, expireSecond, bucketType, fileName))) + .downloadSignUrl(UrlUtil.httpToHttps(this.downloadHuaweiSignUrl(bucketName, key, expireSecond, bucketType, fileName, hasFileName))) .build(); case OSS:// 阿里云 return SignUrlUploadVo.builder() .signUrl(UrlUtil.httpToHttps(aliOssService.uploadSignUrl(bucketName, key, fileName,expireSecond))) .channelCode(channelCode) - .downloadSignUrl(UrlUtil.httpToHttps(this.downloadAliyunSignUrl(bucketName, key, expireSecond, bucketType, fileName))) + .downloadSignUrl(UrlUtil.httpToHttps(this.downloadAliyunSignUrl(bucketName, key, expireSecond, bucketType, fileName, hasFileName))) .build(); default: BizException.error(CodeEnum.CHANNEL_TYPE_NOT_EXIST); @@ -193,10 +193,10 @@ public class FileManagerImpl implements FileManager { /** * 构建华为云下载地址 */ - private String downloadHuaweiSignUrl(String bucketName, String key, Long expireSecond, String bucketType, String fileName) { + private String downloadHuaweiSignUrl(String bucketName, String key, Long expireSecond, String bucketType, String fileName, boolean hasFileName) { switch (BucketTypeEnum.getByCode(bucketType)) { case PRIVATE_BUCKET: - return huaWeiCloudService.downloadSignUrl(bucketName, key, expireSecond, fileName, null); + return huaWeiCloudService.downloadSignUrl(bucketName, key, expireSecond, fileName, null, hasFileName); case PUBLIC_BUCKET: return huaWeiCloudService.getUrl(bucketName, key); default: @@ -208,10 +208,10 @@ public class FileManagerImpl implements FileManager { /** * 构建阿里云下载地址 */ - private String downloadAliyunSignUrl(String bucketName, String key, Long expireSecond, String bucketType, String fileName) { + private String downloadAliyunSignUrl(String bucketName, String key, Long expireSecond, String bucketType, String fileName, boolean hasFileName) { switch (BucketTypeEnum.getByCode(bucketType)) { case PRIVATE_BUCKET: - return aliOssService.downloadSignUrl(bucketName, key, expireSecond, fileName); + return aliOssService.downloadSignUrl(bucketName, key, expireSecond, fileName, hasFileName); case PUBLIC_BUCKET: return aliOssService.getUrl(bucketName, key); default: diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java index b9cdd3b..ca3559a 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java @@ -253,7 +253,7 @@ public class FileByUrlServiceImpl implements FileByUrlService { fileUrl = this.fileManager.fetchDownloadUrl(fileUploadConfig.getBucketName(), tgtFileKey, channelCode); break; case PRIVATE_BUCKET: - fileUrl = this.fileManager.signUrlDownload(fileUploadConfig.getBucketName(), tgtFileKey, Objects.nonNull(expire) ? expire : SIGN_URL_DOWNLOAD_EXPIRE_SECOND , channelCode, fileName, null); + fileUrl = this.fileManager.signUrlDownload(fileUploadConfig.getBucketName(), tgtFileKey, Objects.nonNull(expire) ? expire : SIGN_URL_DOWNLOAD_EXPIRE_SECOND , channelCode, fileName, null,false); break; default: BizException.error(CodeEnum.CHANNEL_TYPE_NOT_EXIST); 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 96cc4b6..4e5052e 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 @@ -501,7 +501,7 @@ public class FileServiceImpl implements FileService { response.setFileKey(fileKey); if (Objects.nonNull(bucketTypeMap.get(file.getAppChannelBucketNo())) && BucketTypeEnum.PRIVATE_BUCKET.getCode().equals(bucketTypeMap.get(file.getAppChannelBucketNo()))) { String tgtFileKey = Utility.generateFileKey(file.getDirectory(), file.getFileUuid(), file.getFileFormat()); - response.setUrl(fileManager.signUrlDownload(file.getBucketName(), tgtFileKey, SIGN_URL_DOWNLOAD_EXPIRE_SECOND, file.getChannelCode(), file.getFileName(), null)); + response.setUrl(fileManager.signUrlDownload(file.getBucketName(), tgtFileKey, SIGN_URL_DOWNLOAD_EXPIRE_SECOND, file.getChannelCode(), file.getFileName(), null, false)); } else { response.setUrl(fileUrl); } @@ -832,6 +832,8 @@ public class FileServiceImpl implements FileService { public List signUrlDownload(SignUrlDownloadDto dto) { log.info("signUrl download dto = {}", JsonUtil.obj2Str(dto)); Long start = System.currentTimeMillis(); + //是否代文件名称 + dto.setHasFileName(Objects.isNull(dto.getHasFileName()) ? true : dto.getHasFileName()); if (CollectionUtil.isEmpty(dto.getFileKeys())) { return Lists.newArrayList(); @@ -845,7 +847,7 @@ public class FileServiceImpl implements FileService { List httpUrlSignResList = this.buildHttpUrlSignResponse(dto); //3 构建fileKey入参对象集合 - List fileKeyResList = this.buildFileKeyResponse(dto.getFileKeys(), dto.getBizScene(), dto.getStyle()); + List fileKeyResList = this.buildFileKeyResponse(dto.getFileKeys(), dto.getBizScene(), dto.getStyle(), dto.getHasFileName()); //4 1/2/3集合累加 httpUrlResList.addAll(fileKeyResList); httpUrlResList.addAll(httpUrlSignResList); @@ -856,7 +858,7 @@ public class FileServiceImpl implements FileService { /** * 构建fileKey(非http的入参)的返回对象 */ - private List buildFileKeyResponse(List fileKeys, String bizScene, String style) { + private List buildFileKeyResponse(List fileKeys, String bizScene, String style, boolean hasFileName) { if (CollectionUtil.isEmpty(fileKeys)) { return Lists.newArrayList(); } @@ -877,13 +879,13 @@ 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); + return this.buildFileKeyRespByFile(fileList, bucketTypeMap, bizSceneExpireMap, style, hasFileName); } /** * 通过File对象,构建返回集合 */ - private List buildFileKeyRespByFile(List fileList,Map bucketTypeMap, Map bizSceneExpireMap, String style) { + private List buildFileKeyRespByFile(List fileList,Map bucketTypeMap, Map bizSceneExpireMap, String style, boolean hasFileName) { List responseList = fileList.stream().map(item -> { Long expire = bizSceneExpireMap.get(item.getAppChannelBucketNo()); // bucket下的key @@ -897,7 +899,7 @@ public class FileServiceImpl implements FileService { .fileKey(item.getFileUuid()) .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); + 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()) @@ -952,7 +954,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()); + List responseList = this.buildFileKeyResponse(Lists.newArrayList(map.values()), null, dto.getStyle(), dto.getHasFileName()); if (CollectionUtil.isEmpty(responseList)) { return httpUrlList.stream().map(item -> SignUrlDownloadResponse.builder().fileKey(item).signUrl(item).build()).collect(Collectors.toList()); } @@ -1079,7 +1081,9 @@ public class FileServiceImpl implements FileService { 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()); + , 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); From 69746d588365446b176585e32adf8f769f46e9f3 Mon Sep 17 00:00:00 2001 From: xudawei Date: Wed, 15 May 2024 15:43:16 +0800 Subject: [PATCH 11/20] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=88=96=E8=80=85?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E6=97=B6=EF=BC=8C=E5=8A=A0=E4=B8=8A=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=90=8D=E7=A7=B0=E5=8F=82=E6=95=B0=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/oss/http/model/ApiSignUrlDownloadRequest.java | 5 +++++ .../java/cn/axzo/oss/http/model/ApiSignUrlUploadRequest.java | 5 +++++ 2 files changed, 10 insertions(+) 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 8c5b34a..45bde52 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 @@ -37,4 +37,9 @@ public class ApiSignUrlDownloadRequest { */ private String style; + /** + * 是否带上文件名称 + */ + private Boolean hasFileName = true; + } 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 aef2959..32d3b14 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 @@ -56,4 +56,9 @@ public class ApiSignUrlUploadRequest { * 过期时间 */ private Long expiration; + + /** + * 是否带上文件名称 + */ + private Boolean hasFileName = true; } From 17c794c69f8f4fa71797c907925725bdbd8ece40 Mon Sep 17 00:00:00 2001 From: xudawei Date: Thu, 16 May 2024 11:35:39 +0800 Subject: [PATCH 12/20] =?UTF-8?q?=E5=8A=A0=E4=B8=8Aaxzo-common-trace?= =?UTF-8?q?=E7=9A=84pom.xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oss-service/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/oss-service/pom.xml b/oss-service/pom.xml index ed085cf..95ed16a 100644 --- a/oss-service/pom.xml +++ b/oss-service/pom.xml @@ -26,6 +26,11 @@ com.huaweicloud esdk-obs-java-bundle + + + cn.axzo.framework.logging + axzo-common-trace + From 66bac36dba2198f62ec67d9a0a32ab79e0e608ea Mon Sep 17 00:00:00 2001 From: xudawei Date: Thu, 16 May 2024 11:43:18 +0800 Subject: [PATCH 13/20] =?UTF-8?q?=E5=8A=A0=E4=B8=8Aaxzo-common-trace?= =?UTF-8?q?=E7=9A=84pom.xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oss-service/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/oss-service/pom.xml b/oss-service/pom.xml index 95ed16a..251bf2e 100644 --- a/oss-service/pom.xml +++ b/oss-service/pom.xml @@ -26,10 +26,15 @@ com.huaweicloud esdk-obs-java-bundle + + io.jsonwebtoken + jjwt + cn.axzo.framework.logging axzo-common-trace + 1.0.0-SNAPSHOT From aa4ea0ceceaf70735f21037d49be775b31fca32c Mon Sep 17 00:00:00 2001 From: xudawei Date: Thu, 16 May 2024 15:12:36 +0800 Subject: [PATCH 14/20] =?UTF-8?q?=E5=90=AF=E5=8A=A8=E7=B1=BBBootstrap?= =?UTF-8?q?=E5=8A=A0=E4=B8=8A=E6=89=AB=E6=8F=8F=E7=B1=BBcommon-trace?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 25cc699..a4bf0c3 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java @@ -13,7 +13,7 @@ import org.springframework.cloud.openfeign.EnableFeignClients; @Slf4j @MapperScan(basePackages = {"cn.axzo.oss.dal.mapper", "cn.axzo.oss.client.icon.mapper"}) @EnableFeignClients(basePackages = {"cn.axzo.log.platform.client"}) -@SpringBootApplication(scanBasePackages = {"cn.axzo.oss"}) +@SpringBootApplication(scanBasePackages = {"cn.axzo.oss", "com.axzo.framework"}) public class Bootstrap { public static void main(String[] args) { log.info("axzo oss begin starting..."); From 1c653d3de0522b0bd32b95590e6fcd90fcddaf2d Mon Sep 17 00:00:00 2001 From: xudawei Date: Thu, 16 May 2024 15:38:57 +0800 Subject: [PATCH 15/20] =?UTF-8?q?=E5=90=AF=E5=8A=A8=E7=B1=BBBootstrap?= =?UTF-8?q?=E5=8A=A0=E4=B8=8A=E6=89=AB=E6=8F=8F=E7=B1=BBcommon-trace?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java | 2 +- oss-service/pom.xml | 6 ------ 2 files changed, 1 insertion(+), 7 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 a4bf0c3..25cc699 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java @@ -13,7 +13,7 @@ import org.springframework.cloud.openfeign.EnableFeignClients; @Slf4j @MapperScan(basePackages = {"cn.axzo.oss.dal.mapper", "cn.axzo.oss.client.icon.mapper"}) @EnableFeignClients(basePackages = {"cn.axzo.log.platform.client"}) -@SpringBootApplication(scanBasePackages = {"cn.axzo.oss", "com.axzo.framework"}) +@SpringBootApplication(scanBasePackages = {"cn.axzo.oss"}) public class Bootstrap { public static void main(String[] args) { log.info("axzo oss begin starting..."); diff --git a/oss-service/pom.xml b/oss-service/pom.xml index 251bf2e..c0648ca 100644 --- a/oss-service/pom.xml +++ b/oss-service/pom.xml @@ -30,12 +30,6 @@ io.jsonwebtoken jjwt - - - cn.axzo.framework.logging - axzo-common-trace - 1.0.0-SNAPSHOT - From 6fb59fce23b4923884f5b3372b66606b46fa8c9e Mon Sep 17 00:00:00 2001 From: xudawei Date: Thu, 16 May 2024 17:35:17 +0800 Subject: [PATCH 16/20] =?UTF-8?q?=E5=90=AF=E5=8A=A8=E7=B1=BBBootstrap?= =?UTF-8?q?=E5=8A=A0=E4=B8=8A=E6=89=AB=E6=8F=8F=E7=B1=BBcommon-trace?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java | 2 +- oss-service/pom.xml | 6 ++++-- 2 files changed, 5 insertions(+), 3 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 25cc699..c2c8bd9 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java @@ -13,7 +13,7 @@ import org.springframework.cloud.openfeign.EnableFeignClients; @Slf4j @MapperScan(basePackages = {"cn.axzo.oss.dal.mapper", "cn.axzo.oss.client.icon.mapper"}) @EnableFeignClients(basePackages = {"cn.axzo.log.platform.client"}) -@SpringBootApplication(scanBasePackages = {"cn.axzo.oss"}) +@SpringBootApplication(scanBasePackages = {"cn.axzo.oss","com.axzo.framework"}) public class Bootstrap { public static void main(String[] args) { log.info("axzo oss begin starting..."); diff --git a/oss-service/pom.xml b/oss-service/pom.xml index c0648ca..96e7fb7 100644 --- a/oss-service/pom.xml +++ b/oss-service/pom.xml @@ -26,9 +26,11 @@ com.huaweicloud esdk-obs-java-bundle + - io.jsonwebtoken - jjwt + cn.axzo.framework.logging + axzo-common-trace + 1.0.0-SNAPSHOT From 46d7fa4100c866a816609a8c070d49cdc4621177 Mon Sep 17 00:00:00 2001 From: xudawei Date: Fri, 17 May 2024 17:44:56 +0800 Subject: [PATCH 17/20] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E4=B8=AD=E5=87=BA=E5=8F=82=E5=8A=A0=E4=B8=8A=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/oss/http/model/ApiSignUrlUploadResponse.java | 5 +++++ .../oss/manager/api/dto/response/SignUrlUploadResponse.java | 5 +++++ .../main/java/cn/axzo/oss/service/impl/FileServiceImpl.java | 1 + 3 files changed, 11 insertions(+) diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/model/ApiSignUrlUploadResponse.java b/oss-http-api/src/main/java/cn/axzo/oss/http/model/ApiSignUrlUploadResponse.java index 1c3e762..7313f0d 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/model/ApiSignUrlUploadResponse.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/model/ApiSignUrlUploadResponse.java @@ -46,4 +46,9 @@ public class ApiSignUrlUploadResponse { * 下载url */ private String downloadSignUrl; + + /** + * 文件名称 + */ + private String fileName; } diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/response/SignUrlUploadResponse.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/response/SignUrlUploadResponse.java index e947ccd..4f0682f 100644 --- a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/response/SignUrlUploadResponse.java +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/response/SignUrlUploadResponse.java @@ -46,4 +46,9 @@ public class SignUrlUploadResponse { * 下载url */ private String downloadSignUrl; + + /** + * 文件名称 + */ + private String 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 4e5052e..7eac387 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 @@ -1094,6 +1094,7 @@ public class FileServiceImpl implements FileService { .host(signUrlUpload.getHost()) .channelCode(signUrlUpload.getChannelCode()) .downloadSignUrl(UrlUtil.httpToHttps(signUrlUpload.getDownloadSignUrl())) + .fileName(dto.getFileName()) .build(); } From a04e2942ef556549c7fd0b6d224604224fafe41f Mon Sep 17 00:00:00 2001 From: xudawei Date: Fri, 17 May 2024 21:36:10 +0800 Subject: [PATCH 18/20] =?UTF-8?q?=E5=85=AC=E6=9C=89=E6=A1=B6=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0style=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../s3/impl/HuaWeiCloudServiceImpl.java | 2 +- .../oss/service/impl/FileByUrlServiceImpl.java | 1 + .../cn/axzo/oss/service/impl/FileServiceImpl.java | 14 ++++++++++---- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java index 2e828c4..316d4de 100644 --- a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java @@ -344,7 +344,7 @@ public class HuaWeiCloudServiceImpl implements HuaWeiCloudService { queryParams.put("response-content-disposition", "attachment;filename=\"" + URLEncoder.encode(fileName, "utf-8") + "\""); } if (StringUtils.hasText(style)) { - queryParams.put("x-image-process", "image/auto-orient,1/resize,p_50/quality,q_30"); + queryParams.put("x-image-process", style); } if (!CollectionUtils.isEmpty(queryParams)) { request.setQueryParams(queryParams); diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java index ca3559a..999dea8 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java @@ -137,6 +137,7 @@ public class FileByUrlServiceImpl implements FileByUrlService { Long start = System.currentTimeMillis(); //重新构建链接 url = this.rebuildUrl(url, style); + log.info("uploadByUrl-style-url:{}",url); File ossFile = uploadFileAndGetFile(appCode, bizScene, fileName, url, channelType); //操作日志记录 operateLog(this.buildUploadParams(appCode, bizScene, fileName, url, channelType), "", FILE_UPLOAD_CODE, FILE_UPLOAD_NAME, 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 7eac387..f42a891 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 @@ -924,7 +924,7 @@ public class FileServiceImpl implements FileService { return Lists.newArrayList(); } return httpUrlList.stream().map(item -> SignUrlDownloadResponse.builder() - .signUrl(item + this.buildPublicXImageProcess(dto.getStyle())) + .signUrl(this.buildPublicXImageProcess(item, dto.getStyle())) .fileKey(item) .build()).collect(Collectors.toList()); } @@ -932,11 +932,17 @@ public class FileServiceImpl implements FileService { /** * 构建公开Style */ - private String buildPublicXImageProcess(String style) { + private String buildPublicXImageProcess(String url, String style) { if (StringUtils.isBlank(style)) { - return ""; + return url; } - return "?x-oss-process=" + style; + if (url.toLowerCase().contains("aliyun")) { + return url + "?x-oss-process=" + style; + } + if (url.toLowerCase().contains("huaweicloud")) { + return url + "?x-image-process=" + style; + } + return url; } /** From 128a9a8376233ed331faf7cec38add01f014c404 Mon Sep 17 00:00:00 2001 From: xudawei Date: Fri, 7 Jun 2024 22:11:52 +0800 Subject: [PATCH 19/20] =?UTF-8?q?=E5=8A=A0=E4=B8=8A=E5=8D=8E=E4=B8=BA?= =?UTF-8?q?=E4=BA=91=E5=85=83=E6=95=B0=E6=8D=AE=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ServerFileController.java | 19 ++++++++- .../cn/axzo/oss/common/utils/UrlUtil.java | 15 ++++--- .../integration/s3/HuaWeiCloudService.java | 6 +++ .../s3/impl/HuaWeiCloudServiceImpl.java | 39 ++++++++++++++++++- .../oss/manager/impl/FileManagerImpl.java | 4 +- 5 files changed, 73 insertions(+), 10 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 8c5d299..2f2a617 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 @@ -158,15 +158,30 @@ public class ServerFileController implements ServerFileServiceApi { 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() - , ChannelTypeEnum.OSS.getChannelCode()); + , 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; + } + /** * 文件元数据信息-批量 */ 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 7e8870b..5772bcc 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 @@ -47,11 +47,16 @@ public class UrlUtil { if (org.springframework.util.StringUtils.hasText(bucketKey)) { return bucketKey; } - if (org.springframework.util.StringUtils.hasText(url)) { - if (url.contains(".") && url.contains("//")) { - String urlPathNoHttp = url.split("//")[1]; - return urlPathNoHttp.substring(urlPathNoHttp.indexOf("/") + 1); - } + + if (StringUtils.isBlank(url)) { + return url; + } + if (url.contains("?")) { + url = url.split("\\?")[0]; + } + if (url.contains(".") && url.contains("//")) { + String urlPathNoHttp = url.split("//")[1]; + return urlPathNoHttp.substring(urlPathNoHttp.indexOf("/") + 1); } return url; } diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/HuaWeiCloudService.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/HuaWeiCloudService.java index 4528510..ec41f89 100644 --- a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/HuaWeiCloudService.java +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/HuaWeiCloudService.java @@ -1,5 +1,6 @@ package cn.axzo.oss.integration.s3; +import com.obs.services.model.ObjectMetadata; import com.obs.services.model.TemporarySignatureResponse; import java.io.InputStream; @@ -45,4 +46,9 @@ public interface HuaWeiCloudService { * 通过url上传OBS */ String uploadFileByUrl(String bucketName, String key, String fileName, String url); + + /** + * 元数据 + */ + ObjectMetadata getObjectMeta(String bucketName, String key, String url); } diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java index 316d4de..ca562c1 100644 --- a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java @@ -1,7 +1,7 @@ package cn.axzo.oss.integration.s3.impl; -import cn.axzo.oss.common.enums.FileDownloadTypeEnum; import cn.axzo.oss.common.enums.CodeEnum; +import cn.axzo.oss.common.enums.FileDownloadTypeEnum; import cn.axzo.oss.common.exception.BizException; import cn.axzo.oss.common.utils.JsonUtil; import cn.axzo.oss.integration.s3.HuaWeiCloudService; @@ -13,7 +13,25 @@ import cn.hutool.json.JSONUtil; import com.google.common.collect.Maps; import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; -import com.obs.services.model.*; +import com.obs.services.model.CompleteMultipartUploadRequest; +import com.obs.services.model.CompleteMultipartUploadResult; +import com.obs.services.model.DeleteObjectResult; +import com.obs.services.model.DownloadFileRequest; +import com.obs.services.model.DownloadFileResult; +import com.obs.services.model.GetObjectRequest; +import com.obs.services.model.HttpMethodEnum; +import com.obs.services.model.InitiateMultipartUploadRequest; +import com.obs.services.model.InitiateMultipartUploadResult; +import com.obs.services.model.ObjectMetadata; +import com.obs.services.model.ObsObject; +import com.obs.services.model.PartEtag; +import com.obs.services.model.PutObjectRequest; +import com.obs.services.model.PutObjectResult; +import com.obs.services.model.TemporarySignatureRequest; +import com.obs.services.model.TemporarySignatureResponse; +import com.obs.services.model.UploadFileRequest; +import com.obs.services.model.UploadPartRequest; +import com.obs.services.model.UploadPartResult; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -437,4 +455,21 @@ public class HuaWeiCloudServiceImpl implements HuaWeiCloudService { } + /** + * 元数据 + */ + @Override + public ObjectMetadata getObjectMeta(String bucketName, String key, String url) { + try { + if (org.apache.commons.lang3.StringUtils.isNotBlank(url) && url.toLowerCase().startsWith("http") && url.toLowerCase().contains("huaweicloud")) { + return huaWeiCloudObsClient.getClient().getObjectMetadata(bucketName, key); + } + log.info("huaweicloud-none-endpoint getObjectMeta params, bucketName:{}, key:{},url:{}", bucketName, key, url); + return new ObjectMetadata(); + } catch (Exception e) { + log.warn("huaweicloud-getObjectMeta-exception, bucketName:{}, key:{}", bucketName, key, e); + return new ObjectMetadata(); + } + } + } 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 1067423..ae55f60 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 @@ -16,6 +16,7 @@ import cn.axzo.oss.manager.api.dto.request.MultipartUploadDto; import cn.axzo.oss.manager.api.dto.response.ManaGetObjectMetaResponse; import cn.axzo.oss.manager.api.vo.SignUrlUploadVo; import com.aliyun.oss.model.SimplifiedObjectMeta; +import com.obs.services.model.ObjectMetadata; import com.obs.services.model.TemporarySignatureResponse; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; @@ -263,7 +264,8 @@ public class FileManagerImpl implements FileManager { ChannelTypeEnum typeEnum = ChannelTypeEnum.getChannelTypeByChannelCode(channelCode); switch (typeEnum) { case OBS:// 华为云 - return ManaGetObjectMetaResponse.builder().build(); + ObjectMetadata objectMetadata = huaWeiCloudService.getObjectMeta(bucketName, key, url); + return ManaGetObjectMetaResponse.builder().bucketName(bucketName).key(key).size(objectMetadata.getContentLength()).build(); case OSS:// 阿里云 SimplifiedObjectMeta simplifiedObjectMeta = aliOssService.getObjectMeta(bucketName, key, url); return ManaGetObjectMetaResponse.builder().bucketName(bucketName).key(key).size(simplifiedObjectMeta.getSize()).build(); From 49495b2f2e72afac33801c0b4aa9cdd91edb55dc Mon Sep 17 00:00:00 2001 From: xudawei Date: Mon, 10 Jun 2024 22:08:26 +0800 Subject: [PATCH 20/20] =?UTF-8?q?=E5=85=AC=E6=9C=89=E6=A1=B6=E5=8A=A0?= =?UTF-8?q?=E4=B8=8A=E8=A3=81=E5=89=AAx-process?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/oss/common/utils/UrlUtil.java | 14 ++++++++++---- .../cn/axzo/oss/service/impl/FileServiceImpl.java | 10 +++++----- 2 files changed, 15 insertions(+), 9 deletions(-) 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 5772bcc..5609600 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 @@ -10,8 +10,14 @@ import org.apache.commons.lang3.StringUtils; public class UrlUtil { - public static String HTTP = "http:"; - public static String HTTPS = "https:"; + public static String HTTP_START = "http:"; + public static String HTTPS_START = "https:"; + public static String X_OSS_PROCESS = "x-oss-process"; + public static String X_OSS_PROCESS_APPEND = "?x-oss-process="; + public static String X_IMAGE_PROCESS = "x-image-process"; + public static String X_IMAGE_PROCESS_APPEND = "?x-image-process="; + public static String ALIYUN = "aliyun"; + public static String HUAWEICLOUD = "huaweicloud"; /** * http的url替换成https @@ -20,8 +26,8 @@ public class UrlUtil { if (StringUtils.isBlank(str)) { return str; } - if (str.startsWith(HTTP)) { - return HTTPS + str.substring(str.indexOf(HTTP) + HTTP.length()); + if (str.startsWith(HTTP_START)) { + return HTTPS_START + str.substring(str.indexOf(HTTP_START) + HTTP_START.length()); } return str; } 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 e9f354e..79248db 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 @@ -896,7 +896,7 @@ public class FileServiceImpl implements FileService { case PUBLIC_BUCKET://公有桶 - 永久链接,例如 http://xxx.png String url = this.fileManager.fetchDownloadUrl(item.getBucketName(), tgtFileKey, item.getChannelCode()); return SignUrlDownloadResponse.builder() - .signUrl(url) + .signUrl(this.buildPublicXImageProcess(url, style)) .fileKey(item.getFileUuid()) .build(); case PRIVATE_BUCKET://私有桶 - 临时授权链接 例如 http://xxx.png?Expire=a&AccessKeyId=b&Signature=c&repsonse-content-disposition=d @@ -937,11 +937,11 @@ public class FileServiceImpl implements FileService { if (StringUtils.isBlank(style)) { return url; } - if (url.toLowerCase().contains("aliyun")) { - return url + "?x-oss-process=" + style; + if (url.toLowerCase().contains(UrlUtil.ALIYUN) && !url.toLowerCase().contains(UrlUtil.X_OSS_PROCESS)) { + return url + UrlUtil.X_OSS_PROCESS_APPEND + style; } - if (url.toLowerCase().contains("huaweicloud")) { - return url + "?x-image-process=" + style; + if (url.toLowerCase().contains(UrlUtil.HUAWEICLOUD) && !url.toLowerCase().contains(UrlUtil.X_IMAGE_PROCESS)) { + return url + UrlUtil.X_IMAGE_PROCESS_APPEND + style; } return url; }