minio listParts无法查询到partNumber为0的Part

作者:@caseyfu
本文为作者原创,转载请注明出处:https://www.cnblogs.com/caseor/p/minio-partNumber-0.html


目录

描述
原因:
解决办法:

描述

在做minio分片上传功能时,部分上传分片成功,调用listParts方法查看已上传的分片,发现没有partNumber为0的Part。

原因:

调用listParts时传入的partNumberMarker参数限制了查询的开始位置。

MinioParams minioParams = MinioParams.builder()
.bucketName(minioProperties.getBucket())
.uploadId(uploadId)
.objectName(objectName)
// 指定List的起始位置, 只有Part Number数目大于该参数的Part会被列出
.partNumberMarker(0)
.build();
// bug partNumber为0的Part信息没办法返回
ListPartsResponse listPartsResponse = listParts(minioParams);

如果不传入partNumberMarker则值默认会是0,不能传入-1。
如果partNumber为0的part无法被查询出来,最后合并的时候一定会缺少一部分文件。

解决办法:

创建分片的时候一定不能以0开始创建分片!

// 根据前端的分片数量生成分片的上传地址
Map<String, String> queryParams = new HashMap<>(4);
queryParams.put("uploadId", result.getUploadId());
// 一定要注意partNumber从1开始, 从0开始会丢失0这个分片
for (int i = 1; i <= params.getPartCount(); i++) {
queryParams.put("partNumber", String.valueOf(i));
String presignedObjectUrl = getPresignedObjectUrl(minioParams, queryParams);
// 如果为minio做了Nginx代理, 则使用Nginx代理地址
if (!StrUtil.isBlank(minioProperties.getEndpointProxy())) {
presignedObjectUrl = presignedObjectUrl.replace(minioProperties.getEndpoint(), minioProperties.getEndpointProxy());
}
CreatePartResult.PartItem item = new CreatePartResult.PartItem();
item.setPartNumber(i);
item.setUploadUrl(presignedObjectUrl);
result.getParts().add(item);
}
log.info("uploadId: {}", result.getUploadId());
log.info("objectName: {}", params.getObjectName());
log.info("partCount: {}", params.getPartCount());

example地址: https://gitee.com/a2cd/minio-example

posted @   FuKai  阅读(148)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示
目录