update 优化断点续传

This commit is contained in:
AprilWind 2024-04-24 14:31:19 +08:00
parent e91fdfc0b1
commit 08307069b0
4 changed files with 32 additions and 20 deletions

View File

@ -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:";
}

View File

@ -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<MultipartVo> initiateMultipart(@Size(min = 2, max = 255, message = "文件原名长度必须在2到255之间")
@NotBlank(message = "文件原名不能为空") String originalName) {
return R.ok(ossService.initiateMultipart(originalName));
@PostMapping(value = "/multipart")
public R<MultipartVo> multipart(@RequestBody MultipartBo multipartBo) {
String ossStatus = multipartBo.getOssStatus();
return R.ok(ossService.initiateMultipart(multipartBo.getOriginalName(), multipartBo.getMd5Digest()));
}
/**

View File

@ -85,7 +85,7 @@ public interface ISysOssService {
* @param originalName 文件原名
* @return 分片上传对象信息
*/
MultipartVo initiateMultipart(String originalName);
MultipartVo initiateMultipart(String originalName, String md5Digest);
/**
* 上传文件的分段分片上传

View File

@ -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;