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 ae9bc2e62..dbd65fd0a 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 @@ -36,4 +36,10 @@ public interface GlobalConstants { * 三方认证 redis key */ String SOCIAL_AUTH_CODE_KEY = GLOBAL_REDIS_KEY + "social_auth_codes:"; + + /** + * OSS断点续传 + */ + String OSS_CONTINUATION = GLOBAL_REDIS_KEY + "oss_continuation:"; + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysOssController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysOssController.java index 9dac71db9..491ad74c2 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysOssController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysOssController.java @@ -4,15 +4,12 @@ package org.dromara.system.controller.system; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.util.ObjectUtil; import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.Size; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.EditGroup; import org.dromara.common.core.validate.QueryGroup; -import org.dromara.common.idempotent.annotation.RepeatSubmit; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; @@ -112,17 +109,14 @@ public class SysOssController extends BaseController { return toAjax(ossService.deleteWithValidByIds(List.of(ossIds), true)); } - /** - * 初始化分片上传任务 - * - * @param originalName 文件原名 - */ - @RepeatSubmit @SaCheckPermission("system:oss:multipart") - @PostMapping(value = "/multipart/initiate") - public R initiateMultipart(@Size(min = 2, max = 255, message = "文件原名长度必须在2到255之间") - @NotBlank(message = "文件原名不能为空") String originalName) { - return R.ok(ossService.initiateMultipart(originalName)); + @PostMapping(value = "/multipart") + public R multipart(@RequestBody MultipartBo multipartBo) { + String ossStatus = multipartBo.getOssStatus(); + + + + return R.ok(ossService.initiateMultipart(multipartBo.getOriginalName(), multipartBo.getMd5Digest())); } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOssService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOssService.java index f7c8adcd7..337e426d5 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOssService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOssService.java @@ -85,7 +85,7 @@ public interface ISysOssService { * @param originalName 文件原名 * @return 分片上传对象信息 */ - MultipartVo initiateMultipart(String originalName); + MultipartVo initiateMultipart(String originalName, String md5Digest); /** * 上传文件的分段(分片上传) 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 d7dc49e1e..dfd8b5d6e 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 @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.service.OssService; import org.dromara.common.core.utils.MapstructUtils; @@ -23,6 +24,7 @@ import org.dromara.common.oss.entity.PartUploadResult; import org.dromara.common.oss.entity.UploadResult; import org.dromara.common.oss.enumd.AccessPolicyType; import org.dromara.common.oss.factory.OssFactory; +import org.dromara.common.redis.utils.RedisUtils; import org.dromara.system.domain.SysOss; import org.dromara.system.domain.bo.MultipartBo; import org.dromara.system.domain.bo.SysOssBo; @@ -39,6 +41,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.time.Duration; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -248,11 +251,20 @@ public class SysOssServiceImpl implements ISysOssService, OssService { * @return 分片上传对象信息 */ @Override - public MultipartVo initiateMultipart(String originalName) { - String suffix = StringUtils.substring(originalName, originalName.lastIndexOf("."), originalName.length()); - OssClient storage = OssFactory.instance(); - UploadResult uploadResult = storage.initiateMultipart(suffix); - return MapstructUtils.convert(uploadResult, MultipartVo.class); + public MultipartVo initiateMultipart(String originalName, String md5Digest) { + String osskey = GlobalConstants.OSS_CONTINUATION + md5Digest; + MultipartVo multipartVo; + long timeout = RedisUtils.getTimeToLive(osskey); + if ((timeout < 0 ? timeout : timeout / 1000) > 60 * 60 * 2) { + multipartVo = RedisUtils.getCacheObject(osskey); + } else { + String suffix = StringUtils.substring(originalName, originalName.lastIndexOf("."), originalName.length()); + OssClient storage = OssFactory.instance(); + UploadResult uploadResult = storage.initiateMultipart(suffix); + multipartVo = MapstructUtils.convert(uploadResult, MultipartVo.class); + RedisUtils.setCacheObject(osskey, multipartVo, Duration.ofMillis(10800)); + } + return multipartVo; } /** @@ -264,7 +276,7 @@ public class SysOssServiceImpl implements ISysOssService, OssService { @Override public MultipartVo uploadPart(MultipartBo multipartBo) { OssClient storage = OssFactory.instance(); - String privateUrl = storage.uploadPartFutures(multipartBo.getFilename(), multipartBo.getUploadId(), multipartBo.getPartNumber(), multipartBo.getMd5Digest(), 10800); + String privateUrl = storage.uploadPartFutures(multipartBo.getFilename(), multipartBo.getUploadId(), multipartBo.getPartNumber(), multipartBo.getMd5Digest(), 60 * 60 * 72); MultipartVo multipartVo = MapstructUtils.convert(multipartBo, MultipartVo.class); multipartVo.setPrivateUrl(privateUrl); return multipartVo;