From 68d8337db4045a88e5cd1840dea117d1d19765d1 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Sun, 28 Apr 2024 10:46:10 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E5=88=86=E7=89=87?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E4=BC=A0=E5=8F=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/constant/GlobalConstants.java | 5 ++++ .../dromara/system/domain/bo/MultipartBo.java | 18 ++++--------- .../dromara/system/domain/vo/MultipartVo.java | 10 ++++++++ .../service/impl/SysOssServiceImpl.java | 25 ++++++++++++------- 4 files changed, 36 insertions(+), 22 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java index dbd65fd0a..c28cddca8 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java @@ -42,4 +42,9 @@ public interface GlobalConstants { */ String OSS_CONTINUATION = GLOBAL_REDIS_KEY + "oss_continuation:"; + /** + * OSS分片上传 + */ + String OSS_MULTIPART = GLOBAL_REDIS_KEY + "oss_multipart:"; + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/MultipartBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/MultipartBo.java index d32134e48..2bd8ecac0 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/MultipartBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/MultipartBo.java @@ -22,16 +22,15 @@ public class MultipartBo implements Serializable { private static final long serialVersionUID = 1L; /** - * 分片类型 + * 分片类型(必传) */ - @NotBlank(message = "分片类型不能为空", groups = {QueryGroup.class, AddGroup.class, EditGroup.class}) private String ossStatus; /** - * 文件名 + * 文件原名(分片初始化的时候使用) */ - @NotBlank(message = "文件名不能为空", groups = {QueryGroup.class, AddGroup.class, EditGroup.class}) - private String filename; + @Size(min = 2, max = 255, message = "文件原名长度必须在2到255之间") + private String originalName; /** * 用于分片上传任务的 Upload ID @@ -48,7 +47,7 @@ public class MultipartBo implements Serializable { private Integer partNumber; /** - * 内容的 MD5 摘要 + * 内容的 MD5 摘要(初始化的时候,需要第一片的md5值用来判断断点续传) */ @Size(max = 255, message = "内容的 MD5 摘要,如果有的话不能超过255", groups = AddGroup.class) private String md5Digest; @@ -66,13 +65,6 @@ public class MultipartBo implements Serializable { @NotNull(message = "分片编号的标记不能为空", groups = QueryGroup.class) private Integer partNumberMarker; - /** - * 原名 - */ - @NotBlank(message = "原名不能为空", groups = EditGroup.class) - @Size(min = 2, max = 255, message = "文件原名长度必须在2到255之间", groups = EditGroup.class) - private String originalName; - /** * 已上传列表(最大长度一万) * 必须是唯一且按照递增顺序排列,严格检查是否漏传 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MultipartVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MultipartVo.java index 1dc9f5266..f6b151f0c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MultipartVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MultipartVo.java @@ -24,12 +24,22 @@ public class MultipartVo implements Serializable { */ private String filename; + /** + * 文件原名(分片初始化的时候使用) + */ + private String originalName; + /** * 用于分片上传任务的 Upload ID * 在初始化分片上传时获取,并在后续的分片上传和完成上传过程中使用 */ private String uploadId; + /** + * 文件后缀 + */ + private String suffix; + /** * 分片编号(从1开始递增) */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java index dfd8b5d6e..2af60a2b5 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java @@ -254,6 +254,7 @@ public class SysOssServiceImpl implements ISysOssService, OssService { public MultipartVo initiateMultipart(String originalName, String md5Digest) { String osskey = GlobalConstants.OSS_CONTINUATION + md5Digest; MultipartVo multipartVo; + // 检查是否存在缓存,如果存在且超时时间在2小时内,则从缓存中获取上传信息 long timeout = RedisUtils.getTimeToLive(osskey); if ((timeout < 0 ? timeout : timeout / 1000) > 60 * 60 * 2) { multipartVo = RedisUtils.getCacheObject(osskey); @@ -262,7 +263,9 @@ public class SysOssServiceImpl implements ISysOssService, OssService { OssClient storage = OssFactory.instance(); UploadResult uploadResult = storage.initiateMultipart(suffix); multipartVo = MapstructUtils.convert(uploadResult, MultipartVo.class); - RedisUtils.setCacheObject(osskey, multipartVo, Duration.ofMillis(10800)); + multipartVo.setSuffix(suffix); + RedisUtils.setCacheObject(osskey, multipartVo, Duration.ofMillis(60 * 60 * 72)); + RedisUtils.setCacheObject(GlobalConstants.OSS_MULTIPART + multipartVo.getUploadId(), multipartVo, Duration.ofMillis(60 * 60 * 72)); } return multipartVo; } @@ -275,10 +278,13 @@ public class SysOssServiceImpl implements ISysOssService, OssService { */ @Override public MultipartVo uploadPart(MultipartBo multipartBo) { + String uploadId = multipartBo.getUploadId(); + Integer partNumber = multipartBo.getPartNumber(); + MultipartVo multipartVo = RedisUtils.getCacheObject(GlobalConstants.OSS_MULTIPART + uploadId); OssClient storage = OssFactory.instance(); - String privateUrl = storage.uploadPartFutures(multipartBo.getFilename(), multipartBo.getUploadId(), multipartBo.getPartNumber(), multipartBo.getMd5Digest(), 60 * 60 * 72); - MultipartVo multipartVo = MapstructUtils.convert(multipartBo, MultipartVo.class); + String privateUrl = storage.uploadPartFutures(multipartVo.getFilename(), uploadId, partNumber, multipartBo.getMd5Digest(), 60 * 60 * 72); multipartVo.setPrivateUrl(privateUrl); + multipartVo.setPartNumber(partNumber); return multipartVo; } @@ -290,9 +296,10 @@ public class SysOssServiceImpl implements ISysOssService, OssService { */ @Override public MultipartVo uploadPartList(MultipartBo multipartBo) { + String uploadId = multipartBo.getUploadId(); + MultipartVo multipartVo = RedisUtils.getCacheObject(GlobalConstants.OSS_MULTIPART + uploadId); OssClient storage = OssFactory.instance(); - List listParts = storage.listParts(multipartBo.getFilename(), multipartBo.getUploadId(), multipartBo.getMaxParts(), multipartBo.getPartNumberMarker()); - MultipartVo multipartVo = MapstructUtils.convert(multipartBo, MultipartVo.class); + List listParts = storage.listParts(multipartVo.getFilename(), uploadId, multipartBo.getMaxParts(), multipartBo.getPartNumberMarker()); multipartVo.setPartUploadList(listParts.stream() .map(x -> new MultipartVo.PartUploadResult(x.getPartNumber(), x.getETag())) .collect(Collectors.toList())); @@ -307,8 +314,8 @@ public class SysOssServiceImpl implements ISysOssService, OssService { */ @Override public SysOssVo completeMultipartUpload(MultipartBo multipartBo) { - String originalName = multipartBo.getOriginalName(); - String suffix = StringUtils.substring(originalName, originalName.lastIndexOf("."), originalName.length()); + String uploadId = multipartBo.getUploadId(); + MultipartVo multipartVo = RedisUtils.getCacheObject(GlobalConstants.OSS_MULTIPART + uploadId); List listParts = multipartBo.getPartUploadList().stream() .map(x -> PartUploadResult.builder() .partNumber(x.getPartNumber()) @@ -316,9 +323,9 @@ public class SysOssServiceImpl implements ISysOssService, OssService { .build()) .collect(Collectors.toList()); OssClient storage = OssFactory.instance(); - UploadResult uploadResult = storage.completeMultipartUpload(multipartBo.getFilename(), multipartBo.getUploadId(), listParts); + UploadResult uploadResult = storage.completeMultipartUpload(multipartVo.getFilename(), uploadId, listParts); // 保存文件信息 - return buildResultEntity(originalName, suffix, storage.getConfigKey(), uploadResult); + return buildResultEntity(multipartVo.getOriginalName(), multipartVo.getSuffix(), storage.getConfigKey(), uploadResult); } /**