minio listParts无法查询到partNumber为0的Part
描述
在做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