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

浙公網安備 33010602011771號