mirror of
https://gitee.com/dromara/RuoYi-Vue-Plus.git
synced 2026-09-20 18:15:56 +08:00
update 优化断点续传
This commit is contained in:
parent
e91fdfc0b1
commit
08307069b0
@ -36,4 +36,10 @@ public interface GlobalConstants {
|
|||||||
* 三方认证 redis key
|
* 三方认证 redis key
|
||||||
*/
|
*/
|
||||||
String SOCIAL_AUTH_CODE_KEY = GLOBAL_REDIS_KEY + "social_auth_codes:";
|
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.dev33.satoken.annotation.SaCheckPermission;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
import jakarta.validation.constraints.NotBlank;
|
|
||||||
import jakarta.validation.constraints.NotEmpty;
|
import jakarta.validation.constraints.NotEmpty;
|
||||||
import jakarta.validation.constraints.Size;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.dromara.common.core.domain.R;
|
import org.dromara.common.core.domain.R;
|
||||||
import org.dromara.common.core.validate.AddGroup;
|
import org.dromara.common.core.validate.AddGroup;
|
||||||
import org.dromara.common.core.validate.EditGroup;
|
import org.dromara.common.core.validate.EditGroup;
|
||||||
import org.dromara.common.core.validate.QueryGroup;
|
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.annotation.Log;
|
||||||
import org.dromara.common.log.enums.BusinessType;
|
import org.dromara.common.log.enums.BusinessType;
|
||||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
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));
|
return toAjax(ossService.deleteWithValidByIds(List.of(ossIds), true));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 初始化分片上传任务
|
|
||||||
*
|
|
||||||
* @param originalName 文件原名
|
|
||||||
*/
|
|
||||||
@RepeatSubmit
|
|
||||||
@SaCheckPermission("system:oss:multipart")
|
@SaCheckPermission("system:oss:multipart")
|
||||||
@PostMapping(value = "/multipart/initiate")
|
@PostMapping(value = "/multipart")
|
||||||
public R<MultipartVo> initiateMultipart(@Size(min = 2, max = 255, message = "文件原名长度必须在2到255之间")
|
public R<MultipartVo> multipart(@RequestBody MultipartBo multipartBo) {
|
||||||
@NotBlank(message = "文件原名不能为空") String originalName) {
|
String ossStatus = multipartBo.getOssStatus();
|
||||||
return R.ok(ossService.initiateMultipart(originalName));
|
|
||||||
|
|
||||||
|
|
||||||
|
return R.ok(ossService.initiateMultipart(multipartBo.getOriginalName(), multipartBo.getMd5Digest()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -85,7 +85,7 @@ public interface ISysOssService {
|
|||||||
* @param originalName 文件原名
|
* @param originalName 文件原名
|
||||||
* @return 分片上传对象信息
|
* @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 jakarta.servlet.http.HttpServletResponse;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.dromara.common.core.constant.CacheNames;
|
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.exception.ServiceException;
|
||||||
import org.dromara.common.core.service.OssService;
|
import org.dromara.common.core.service.OssService;
|
||||||
import org.dromara.common.core.utils.MapstructUtils;
|
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.entity.UploadResult;
|
||||||
import org.dromara.common.oss.enumd.AccessPolicyType;
|
import org.dromara.common.oss.enumd.AccessPolicyType;
|
||||||
import org.dromara.common.oss.factory.OssFactory;
|
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.SysOss;
|
||||||
import org.dromara.system.domain.bo.MultipartBo;
|
import org.dromara.system.domain.bo.MultipartBo;
|
||||||
import org.dromara.system.domain.bo.SysOssBo;
|
import org.dromara.system.domain.bo.SysOssBo;
|
||||||
@ -39,6 +41,7 @@ import org.springframework.web.multipart.MultipartFile;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.time.Duration;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -248,11 +251,20 @@ public class SysOssServiceImpl implements ISysOssService, OssService {
|
|||||||
* @return 分片上传对象信息
|
* @return 分片上传对象信息
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public MultipartVo initiateMultipart(String originalName) {
|
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());
|
String suffix = StringUtils.substring(originalName, originalName.lastIndexOf("."), originalName.length());
|
||||||
OssClient storage = OssFactory.instance();
|
OssClient storage = OssFactory.instance();
|
||||||
UploadResult uploadResult = storage.initiateMultipart(suffix);
|
UploadResult uploadResult = storage.initiateMultipart(suffix);
|
||||||
return MapstructUtils.convert(uploadResult, MultipartVo.class);
|
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
|
@Override
|
||||||
public MultipartVo uploadPart(MultipartBo multipartBo) {
|
public MultipartVo uploadPart(MultipartBo multipartBo) {
|
||||||
OssClient storage = OssFactory.instance();
|
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 multipartVo = MapstructUtils.convert(multipartBo, MultipartVo.class);
|
||||||
multipartVo.setPrivateUrl(privateUrl);
|
multipartVo.setPrivateUrl(privateUrl);
|
||||||
return multipartVo;
|
return multipartVo;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user