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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了