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

发布时间 2023-04-13 15:57:01作者: FuKai

描述

在做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/caseor/minio-example