update 优化分片上传传参

This commit is contained in:
AprilWind 2024-04-28 10:46:10 +08:00
parent 80f95d8684
commit 68d8337db4
4 changed files with 36 additions and 22 deletions

View File

@ -42,4 +42,9 @@ public interface GlobalConstants {
*/ */
String OSS_CONTINUATION = GLOBAL_REDIS_KEY + "oss_continuation:"; String OSS_CONTINUATION = GLOBAL_REDIS_KEY + "oss_continuation:";
/**
* OSS分片上传
*/
String OSS_MULTIPART = GLOBAL_REDIS_KEY + "oss_multipart:";
} }

View File

@ -22,16 +22,15 @@ public class MultipartBo implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** /**
* 分片类型 * 分片类型必传
*/ */
@NotBlank(message = "分片类型不能为空", groups = {QueryGroup.class, AddGroup.class, EditGroup.class})
private String ossStatus; private String ossStatus;
/** /**
* 文件 * 文件分片初始化的时候使用
*/ */
@NotBlank(message = "文件名不能为空", groups = {QueryGroup.class, AddGroup.class, EditGroup.class}) @Size(min = 2, max = 255, message = "文件原名长度必须在2到255之间")
private String filename; private String originalName;
/** /**
* 用于分片上传任务的 Upload ID * 用于分片上传任务的 Upload ID
@ -48,7 +47,7 @@ public class MultipartBo implements Serializable {
private Integer partNumber; private Integer partNumber;
/** /**
* 内容的 MD5 摘要 * 内容的 MD5 摘要初始化的时候需要第一片的md5值用来判断断点续传
*/ */
@Size(max = 255, message = "内容的 MD5 摘要如果有的话不能超过255", groups = AddGroup.class) @Size(max = 255, message = "内容的 MD5 摘要如果有的话不能超过255", groups = AddGroup.class)
private String md5Digest; private String md5Digest;
@ -66,13 +65,6 @@ public class MultipartBo implements Serializable {
@NotNull(message = "分片编号的标记不能为空", groups = QueryGroup.class) @NotNull(message = "分片编号的标记不能为空", groups = QueryGroup.class)
private Integer partNumberMarker; private Integer partNumberMarker;
/**
* 原名
*/
@NotBlank(message = "原名不能为空", groups = EditGroup.class)
@Size(min = 2, max = 255, message = "文件原名长度必须在2到255之间", groups = EditGroup.class)
private String originalName;
/** /**
* 已上传列表最大长度一万 * 已上传列表最大长度一万
* 必须是唯一且按照递增顺序排列严格检查是否漏传 * 必须是唯一且按照递增顺序排列严格检查是否漏传

View File

@ -24,12 +24,22 @@ public class MultipartVo implements Serializable {
*/ */
private String filename; private String filename;
/**
* 文件原名分片初始化的时候使用
*/
private String originalName;
/** /**
* 用于分片上传任务的 Upload ID * 用于分片上传任务的 Upload ID
* 在初始化分片上传时获取并在后续的分片上传和完成上传过程中使用 * 在初始化分片上传时获取并在后续的分片上传和完成上传过程中使用
*/ */
private String uploadId; private String uploadId;
/**
* 文件后缀
*/
private String suffix;
/** /**
* 分片编号从1开始递增 * 分片编号从1开始递增
*/ */

View File

@ -254,6 +254,7 @@ public class SysOssServiceImpl implements ISysOssService, OssService {
public MultipartVo initiateMultipart(String originalName, String md5Digest) { public MultipartVo initiateMultipart(String originalName, String md5Digest) {
String osskey = GlobalConstants.OSS_CONTINUATION + md5Digest; String osskey = GlobalConstants.OSS_CONTINUATION + md5Digest;
MultipartVo multipartVo; MultipartVo multipartVo;
// 检查是否存在缓存如果存在且超时时间在2小时内则从缓存中获取上传信息
long timeout = RedisUtils.getTimeToLive(osskey); long timeout = RedisUtils.getTimeToLive(osskey);
if ((timeout < 0 ? timeout : timeout / 1000) > 60 * 60 * 2) { if ((timeout < 0 ? timeout : timeout / 1000) > 60 * 60 * 2) {
multipartVo = RedisUtils.getCacheObject(osskey); multipartVo = RedisUtils.getCacheObject(osskey);
@ -262,7 +263,9 @@ public class SysOssServiceImpl implements ISysOssService, OssService {
OssClient storage = OssFactory.instance(); OssClient storage = OssFactory.instance();
UploadResult uploadResult = storage.initiateMultipart(suffix); UploadResult uploadResult = storage.initiateMultipart(suffix);
multipartVo = MapstructUtils.convert(uploadResult, MultipartVo.class); 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; return multipartVo;
} }
@ -275,10 +278,13 @@ public class SysOssServiceImpl implements ISysOssService, OssService {
*/ */
@Override @Override
public MultipartVo uploadPart(MultipartBo multipartBo) { 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(); OssClient storage = OssFactory.instance();
String privateUrl = storage.uploadPartFutures(multipartBo.getFilename(), multipartBo.getUploadId(), multipartBo.getPartNumber(), multipartBo.getMd5Digest(), 60 * 60 * 72); String privateUrl = storage.uploadPartFutures(multipartVo.getFilename(), uploadId, partNumber, multipartBo.getMd5Digest(), 60 * 60 * 72);
MultipartVo multipartVo = MapstructUtils.convert(multipartBo, MultipartVo.class);
multipartVo.setPrivateUrl(privateUrl); multipartVo.setPrivateUrl(privateUrl);
multipartVo.setPartNumber(partNumber);
return multipartVo; return multipartVo;
} }
@ -290,9 +296,10 @@ public class SysOssServiceImpl implements ISysOssService, OssService {
*/ */
@Override @Override
public MultipartVo uploadPartList(MultipartBo multipartBo) { public MultipartVo uploadPartList(MultipartBo multipartBo) {
String uploadId = multipartBo.getUploadId();
MultipartVo multipartVo = RedisUtils.getCacheObject(GlobalConstants.OSS_MULTIPART + uploadId);
OssClient storage = OssFactory.instance(); OssClient storage = OssFactory.instance();
List<PartUploadResult> listParts = storage.listParts(multipartBo.getFilename(), multipartBo.getUploadId(), multipartBo.getMaxParts(), multipartBo.getPartNumberMarker()); List<PartUploadResult> listParts = storage.listParts(multipartVo.getFilename(), uploadId, multipartBo.getMaxParts(), multipartBo.getPartNumberMarker());
MultipartVo multipartVo = MapstructUtils.convert(multipartBo, MultipartVo.class);
multipartVo.setPartUploadList(listParts.stream() multipartVo.setPartUploadList(listParts.stream()
.map(x -> new MultipartVo.PartUploadResult(x.getPartNumber(), x.getETag())) .map(x -> new MultipartVo.PartUploadResult(x.getPartNumber(), x.getETag()))
.collect(Collectors.toList())); .collect(Collectors.toList()));
@ -307,8 +314,8 @@ public class SysOssServiceImpl implements ISysOssService, OssService {
*/ */
@Override @Override
public SysOssVo completeMultipartUpload(MultipartBo multipartBo) { public SysOssVo completeMultipartUpload(MultipartBo multipartBo) {
String originalName = multipartBo.getOriginalName(); String uploadId = multipartBo.getUploadId();
String suffix = StringUtils.substring(originalName, originalName.lastIndexOf("."), originalName.length()); MultipartVo multipartVo = RedisUtils.getCacheObject(GlobalConstants.OSS_MULTIPART + uploadId);
List<PartUploadResult> listParts = multipartBo.getPartUploadList().stream() List<PartUploadResult> listParts = multipartBo.getPartUploadList().stream()
.map(x -> PartUploadResult.builder() .map(x -> PartUploadResult.builder()
.partNumber(x.getPartNumber()) .partNumber(x.getPartNumber())
@ -316,9 +323,9 @@ public class SysOssServiceImpl implements ISysOssService, OssService {
.build()) .build())
.collect(Collectors.toList()); .collect(Collectors.toList());
OssClient storage = OssFactory.instance(); 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);
} }
/** /**