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
80f95d8684
commit
68d8337db4
@ -42,4 +42,9 @@ public interface GlobalConstants {
|
||||
*/
|
||||
String OSS_CONTINUATION = GLOBAL_REDIS_KEY + "oss_continuation:";
|
||||
|
||||
/**
|
||||
* OSS分片上传
|
||||
*/
|
||||
String OSS_MULTIPART = GLOBAL_REDIS_KEY + "oss_multipart:";
|
||||
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
/**
|
||||
* 已上传列表(最大长度一万)
|
||||
* 必须是唯一且按照递增顺序排列,严格检查是否漏传
|
||||
|
||||
@ -24,12 +24,22 @@ public class MultipartVo implements Serializable {
|
||||
*/
|
||||
private String filename;
|
||||
|
||||
/**
|
||||
* 文件原名(分片初始化的时候使用)
|
||||
*/
|
||||
private String originalName;
|
||||
|
||||
/**
|
||||
* 用于分片上传任务的 Upload ID
|
||||
* 在初始化分片上传时获取,并在后续的分片上传和完成上传过程中使用
|
||||
*/
|
||||
private String uploadId;
|
||||
|
||||
/**
|
||||
* 文件后缀
|
||||
*/
|
||||
private String suffix;
|
||||
|
||||
/**
|
||||
* 分片编号(从1开始递增)
|
||||
*/
|
||||
|
||||
@ -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<PartUploadResult> listParts = storage.listParts(multipartBo.getFilename(), multipartBo.getUploadId(), multipartBo.getMaxParts(), multipartBo.getPartNumberMarker());
|
||||
MultipartVo multipartVo = MapstructUtils.convert(multipartBo, MultipartVo.class);
|
||||
List<PartUploadResult> 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<PartUploadResult> 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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Loading…
Reference in New Issue
Block a user