mirror of
https://gitee.com/dromara/RuoYi-Vue-Plus.git
synced 2026-09-20 02:08:15 +08:00
update 优化断点续传
This commit is contained in:
parent
e91fdfc0b1
commit
08307069b0
@ -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:";
|
||||
|
||||
}
|
||||
|
||||
@ -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()));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -85,7 +85,7 @@ public interface ISysOssService {
|
||||
* @param originalName 文件原名
|
||||
* @return 分片上传对象信息
|
||||
*/
|
||||
MultipartVo initiateMultipart(String originalName);
|
||||
MultipartVo initiateMultipart(String originalName, String md5Digest);
|
||||
|
||||
/**
|
||||
* 上传文件的分段(分片上传)
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user