From 045a561c073bf85422916a53f4531b64d0291b4c Mon Sep 17 00:00:00 2001 From: xudawei Date: Mon, 20 May 2024 11:30:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=8E=B7=E5=8F=96=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=85=83=E6=95=B0=E6=8D=AE=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ServerFileController.java | 28 ++++++++++++++ .../cn/axzo/oss/common/enums/CodeEnum.java | 4 +- .../cn/axzo/oss/common/utils/UrlUtil.java | 38 +++++++++++++++++-- .../oss/http/api/ServerFileServiceApi.java | 8 ++++ .../oss/http/model/GetObjectMetaRequest.java | 30 +++++++++++++++ .../oss/http/model/GetObjectMetaResponse.java | 29 ++++++++++++++ .../oss/integration/s3/AliOssService.java | 6 +++ .../s3/impl/AliOssServiceImpl.java | 15 ++++++++ .../cn/axzo/oss/manager/api/FileManager.java | 6 +++ .../response/ManaGetObjectMetaResponse.java | 35 +++++++++++++++++ .../oss/manager/impl/FileManagerImpl.java | 20 ++++++++++ .../cn/axzo/oss/service/api/FileService.java | 6 +++ .../oss/service/impl/FileServiceImpl.java | 13 ++++++- 13 files changed, 232 insertions(+), 6 deletions(-) create mode 100644 oss-http-api/src/main/java/cn/axzo/oss/http/model/GetObjectMetaRequest.java create mode 100644 oss-http-api/src/main/java/cn/axzo/oss/http/model/GetObjectMetaResponse.java create mode 100644 oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/response/ManaGetObjectMetaResponse.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..23d4e78 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 @@ -2,7 +2,11 @@ package cn.axzo.oss.client.controller; import cn.axzo.core.utils.converter.BeanConverter; import cn.axzo.framework.auth.domain.ContextInfo; +import cn.axzo.oss.common.enums.ChannelTypeEnum; +import cn.axzo.oss.common.enums.CodeEnum; +import cn.axzo.oss.common.exception.BizException; import cn.axzo.oss.common.utils.BeanConvertUtil; +import cn.axzo.oss.common.utils.UrlUtil; import cn.axzo.oss.http.api.ServerFileServiceApi; import cn.axzo.oss.http.model.ApiSignUrlDownloadRequest; import cn.axzo.oss.http.model.ApiSignUrlDownloadResponse; @@ -13,6 +17,8 @@ import cn.axzo.oss.http.model.FindFileKeyRequest; 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.GetObjectMetaRequest; +import cn.axzo.oss.http.model.GetObjectMetaResponse; import cn.axzo.oss.http.model.ServerFileDeleteRequest; import cn.axzo.oss.http.model.ServerFileUploadRequest; import cn.axzo.oss.http.model.ServerFileUploadResponse; @@ -23,10 +29,12 @@ import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; import cn.axzo.oss.manager.api.dto.request.ServerFileUploadDto; import cn.axzo.oss.manager.api.dto.request.SignUrlDownloadDto; import cn.axzo.oss.manager.api.dto.request.SignUrlUploadDto; +import cn.axzo.oss.manager.api.dto.response.ManaGetObjectMetaResponse; import cn.axzo.oss.service.api.FileService; import cn.azxo.framework.common.model.CommonResponse; import cn.hutool.json.JSONUtil; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @@ -127,4 +135,24 @@ 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)); } + + /** + * 文件元数据信息 + */ + @Override + public CommonResponse getObjectMeta(@RequestBody GetObjectMetaRequest request) { + if (!StringUtils.hasText(request.getUrl()) && !StringUtils.hasText(request.getBucketName()) && !StringUtils.hasText(request.getKey())) { + throw new BizException(CodeEnum.URL_BUCKET_NAME_KEY_ALL_EMPTY); + } + + + String bucketName = UrlUtil.fetchBucketName(request.getBucketName(), request.getUrl()); + String bucketKey = UrlUtil.fetchBucketKey(request.getKey(), request.getUrl()); + ManaGetObjectMetaResponse response = this.fileService.getObjectMeta(bucketName + , bucketKey + , ChannelTypeEnum.OSS.getChannelCode()); + return CommonResponse.success(BeanConverter.convert(response, GetObjectMetaResponse.class)); + } + + } diff --git a/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java b/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java index 48d7540..98f9028 100644 --- a/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java +++ b/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java @@ -60,7 +60,9 @@ public enum CodeEnum implements EnumBase { UPLOAD_SIGN_URL_FAIL(503,"上传临时授权获取SIGNURL失败"), DOWNLOAD_SIGN_URL_FAIL(504,"下载临时授权获取SIGNURL失败"), FILE_APP_IS_EMPTY(505, "app is empty"), - BUCKET_TYPE_IS_EMPTY(506, "bucketType is empty") + BUCKET_TYPE_IS_EMPTY(506, "bucketType is empty"), + GET_OBJECT_META_FAIL(507, "获取元文件失败"), + URL_BUCKET_NAME_KEY_ALL_EMPTY(508, "url-bucketName-key同时为空") ; private final Integer code; 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 319e9cd..f4a8457 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 @@ -26,12 +26,42 @@ public class UrlUtil { return str; } + /** + * 通过url或者bucketName,获取桶名称 + */ + public static String fetchBucketName(String bucketName, String url) { + if (org.springframework.util.StringUtils.hasText(bucketName)) { + return bucketName; + } + if (org.springframework.util.StringUtils.hasText(url)) { + if (url.contains(".") && url.contains("//")) { + return url.substring(url.indexOf("//") + 2,url.indexOf(".")); + } + } + return url; + } + /** + * 通过url或者bucketKey,获取桶文件Key + */ + public static String fetchBucketKey(String bucketKey, String url) { + 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); + } + } + return url; + } + public static void main(String[] args) { - String str = "http://axzo-test.oss-cn-chengdu.aliyuncs.com/reportCenter/reportCenter_test"; - String str1 = "https://baidu.com"; - System.out.println(httpToHttps(str)); - System.out.println(httpToHttps(str1)); + String str = "https://axzo-public.oss-cn-chengdu.aliyuncs.com/cms/cms/ecefcd11d1744bd19770ccac2b7724e2.jpg"; + System.out.println(fetchBucketName("", str)); + System.out.println(fetchBucketKey("", str)); + } } 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..b4d3750 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 @@ -9,6 +9,8 @@ import cn.axzo.oss.http.model.FindFileKeyRequest; 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.GetObjectMetaRequest; +import cn.axzo.oss.http.model.GetObjectMetaResponse; import cn.axzo.oss.http.model.ServerFileDeleteRequest; import cn.axzo.oss.http.model.ServerFileUploadRequest; import cn.axzo.oss.http.model.ServerFileUploadResponse; @@ -82,4 +84,10 @@ public interface ServerFileServiceApi { @RequestMapping(value = "api/signUrl/fetchUpload", method = RequestMethod.POST) CommonResponse signUrlFetchUpload(ApiSignUrlUploadRequest request); + /** + * 文件元数据信息 + */ + @RequestMapping(value = "api/server/getObjectMeta", method = RequestMethod.POST) + CommonResponse getObjectMeta(GetObjectMetaRequest request); + } diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/model/GetObjectMetaRequest.java b/oss-http-api/src/main/java/cn/axzo/oss/http/model/GetObjectMetaRequest.java new file mode 100644 index 0000000..2e67b92 --- /dev/null +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/model/GetObjectMetaRequest.java @@ -0,0 +1,30 @@ +package cn.axzo.oss.http.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author: xudawei + * @date: 2024-03-12 + * @description: 授权给第三方下载 + **/ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class GetObjectMetaRequest { + /** + * 桶名称 + */ + private String bucketName; + /** + * 文件key + */ + private String key; + /** + * 文件url + */ + private String url; +} diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/model/GetObjectMetaResponse.java b/oss-http-api/src/main/java/cn/axzo/oss/http/model/GetObjectMetaResponse.java new file mode 100644 index 0000000..fbac79b --- /dev/null +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/model/GetObjectMetaResponse.java @@ -0,0 +1,29 @@ +package cn.axzo.oss.http.model; + +import lombok.Data; + +/** + * 元数据 + * + * @author xudawei + * @since 2024-05-20 + */ +@Data +public class GetObjectMetaResponse { + /** + * 桶名称 + */ + private String bucketName; + /** + * 文件key + */ + private String key; + /** + * 文件url + */ + private String url; + /** + * 文件大小 + */ + private long size; +} 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..2a0376d 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 @@ -1,6 +1,7 @@ package cn.axzo.oss.integration.s3; import cn.axzo.oss.integration.s3.base.BaseS3Service; +import com.aliyun.oss.model.SimplifiedObjectMeta; /** * @program: oss @@ -29,4 +30,9 @@ public interface AliOssService extends BaseS3Service { * 获取url */ String getUrl(String bucketName, String tgtFileKey); + + /** + * 元数据 + */ + SimplifiedObjectMeta getObjectMeta(String bucketName, String key); } 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..f655772 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 @@ -19,6 +19,7 @@ import com.aliyun.oss.model.OSSObject; import com.aliyun.oss.model.ObjectMetadata; import com.aliyun.oss.model.PartETag; import com.aliyun.oss.model.ResponseHeaderOverrides; +import com.aliyun.oss.model.SimplifiedObjectMeta; import com.aliyun.oss.model.UploadPartRequest; import com.aliyun.oss.model.UploadPartResult; import lombok.extern.slf4j.Slf4j; @@ -359,4 +360,18 @@ public class AliOssServiceImpl implements AliOssService { throw new BizException(CodeEnum.DELETE_FILE_FAIL); } } + + /** + * 元数据 + */ + @Override + public SimplifiedObjectMeta getObjectMeta(String bucketName, String key) { + try { + log.info("aliyun getObjectMeta params, bucketName:{}, key:{}", bucketName, key); + return aliOssClient.getClient().getSimplifiedObjectMeta(bucketName, key); + } catch (Exception e) { + log.error("aliyun getObjectMeta exception, bucketName:{}, key:{}", bucketName, key, e); + throw new BizException(CodeEnum.GET_OBJECT_META_FAIL); + } + } } 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..927f949 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 @@ -2,6 +2,7 @@ package cn.axzo.oss.manager.api; import cn.axzo.oss.manager.api.dto.PartETag; 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 org.springframework.web.multipart.MultipartFile; @@ -75,4 +76,9 @@ public interface FileManager { * 根据华为云/阿里云,授权给第三方下载 */ String fetchDownloadUrl(String bucketName, String key, String channelCode); + + /** + * 元数据 + */ + ManaGetObjectMetaResponse getObjectMeta(String bucketName, String key, String channelCode); } diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/response/ManaGetObjectMetaResponse.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/response/ManaGetObjectMetaResponse.java new file mode 100644 index 0000000..fa0b9f8 --- /dev/null +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/response/ManaGetObjectMetaResponse.java @@ -0,0 +1,35 @@ +package cn.axzo.oss.manager.api.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 元数据 + * + * @author xudawei + * @since 2024-05-20 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class ManaGetObjectMetaResponse { + /** + * 桶名称 + */ + private String bucketName; + /** + * 文件key + */ + private String key; + /** + * 文件url + */ + private String url; + /** + * 文件大小 + */ + private long size; +} 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..1820bd6 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 @@ -13,7 +13,9 @@ import cn.axzo.oss.integration.s3.HuaWeiCloudService; import cn.axzo.oss.manager.api.FileManager; import cn.axzo.oss.manager.api.dto.PartETag; 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.TemporarySignatureResponse; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; @@ -252,4 +254,22 @@ public class FileManagerImpl implements FileManager { } return StringUtils.EMPTY; } + + /** + * 元数据 + */ + @Override + public ManaGetObjectMetaResponse getObjectMeta(String bucketName, String key, String channelCode) { + ChannelTypeEnum typeEnum = ChannelTypeEnum.getChannelTypeByChannelCode(channelCode); + switch (typeEnum) { + case OBS:// 华为云 + return ManaGetObjectMetaResponse.builder().build(); + case OSS:// 阿里云 + SimplifiedObjectMeta simplifiedObjectMeta = aliOssService.getObjectMeta(bucketName, key); + return ManaGetObjectMetaResponse.builder().bucketName(bucketName).key(key).size(simplifiedObjectMeta.getSize()).build(); + default: + BizException.error(CodeEnum.CHANNEL_TYPE_NOT_EXIST); + } + return ManaGetObjectMetaResponse.builder().build(); + } } diff --git a/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java b/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java index 74a9cac..08fc277 100644 --- a/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java +++ b/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java @@ -16,6 +16,7 @@ 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.ManaGetObjectMetaResponse; 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; @@ -86,4 +87,9 @@ public interface FileService { * @param dto */ void deleteFile(DeleteFileDto dto); + + /** + * 元数据 + */ + ManaGetObjectMetaResponse getObjectMeta(String bucketName, String key, String channelCode); } 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 1b80c6e..5875367 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 @@ -45,6 +45,7 @@ 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.ManaGetObjectMetaResponse; 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; @@ -1128,6 +1129,16 @@ public class FileServiceImpl implements FileService { fileManager.deleteFile(file.getBucketName(), tgtFileKey,file.getChannelCode()); fileDao.deleteFile(dto.getFileKey()); } - + /** + * 元数据 + */ + @Override + public ManaGetObjectMetaResponse getObjectMeta(String bucketName, String key, String channelCode) { + log.info("getObjectMeta bucketName:{},key:{},channelCode:{}", bucketName, key, channelCode); + Long start = System.currentTimeMillis(); + ManaGetObjectMetaResponse response = fileManager.getObjectMeta(bucketName, key, channelCode); + log.info("getObjectMeta response:{}, times:{}", JsonUtil.obj2Str(response), System.currentTimeMillis() - start); + return response; + } }