143 Star 2.6K Fork 728

dromara/x-file-storage

 / 详情

[问题反馈]: aliyun-oss手工分片上传问题

待办的
创建于  
2024-10-18 17:39

这个问题是否已经存在?

相关依赖及版本号

X File Storage 版本号:2.2.1
SpringBoot 版本号:2.7
JVM 版本号:openJDK8
其它依赖的名称及版本号:aliyun-sdk-oss 3.17.4

配置文件

配置文件没问题

复现代码


    @Test
    @DisplayName("分片上传")
    @Disabled
    @SneakyThrows
    public void testMultipartUpload1() {
        File file = new File("D:\\test.mp4");//文件大概6M
//        File file = new File("D:\\VMware-images\\CentOS-7-x86_64-Minimal-2009.iso");;//900M+
        FileInfo fileInfo = fileStorageService.initiateMultipartUpload().setPlatform("aliyun").setPath("default/").setSaveFilename(file.getName()).init();
        try (
                InputStream in = new FileInputStream(file);
        ) {
            byte[] bs = new byte[5 * 1024 * 1024];//每一片5MB
            int len = 0;
            int partNumber = 0;
            try {
                while ((len = in.read(bs)) > 0) {
                    partNumber++;
                    ByteArrayInputStream bin = new ByteArrayInputStream(bs, 0, len);
                    fileStorageService.uploadPart(fileInfo, partNumber, bin).upload();
                    out("上传分片成功:" + partNumber + " len:" + len);

                }
                out("分片上传成功:" + fileStorageService.completeMultipartUpload(fileInfo).complete().getUrl());
            } catch (Exception e) {
                out("分片上传失败", e);
                fileStorageService.abortMultipartUpload(fileInfo).abort();
            }
        }
    }

预期结果

上传成功

实际结果或详细的报错信息

手动文件分片上传-列举已上传的分片失败!

截图或视频

错误截图
调试截图
说明:我同时配置了local-plus,minio,aliyun-oss,使用前两个都正常完成

评论 (7)

jlzhou 创建了任务 5个月前
jlzhou 添加了
 
question
标签
5个月前
展开全部操作日志

将上传代码中的partNumber从2开始,然后在调试模式下手工修改pre.partNumberMarker的值为1,上传成功

梦想i-XYW1171736840 梦想i 拥有者 5个月前

正常情况下 partNumber 需要从1开始递增就可以了,你可以试一下手动获取分片列表看看结果是怎样的

435568 jlzhou 1596593095 jlzhou
回复 梦想i 拥有者
5个月前

这里的问题不是从1开始的问题,而是调用aliyun-sdk-oss中获取分片列表的方法的时候,传参partNumberMarker为0会报错的问题,返回所有的分片信息partNumberMarker这个参数不要传就可以了,org.dromara.x.file.storage.core.platform.AliyunOssFileStorage第252行原有代码

request.setPartNumberMarker(pre.getPartNumberMarker());

改为

if(pre.getPartNumberMarker()>0){
   request.setPartNumberMarker(pre.getPartNumberMarker());
}

给一个aliyun-oss手工分片上传bug的修复方案

@Component
@Slf4j
@RequiredArgsConstructor
public class FixFileStorageAspect implements FileStorageAspect {

  @Override
  public FilePartInfoList listParts(ListPartsAspectChain chain, ListPartsPretreatment pre, FileStorage fileStorage) {
    if(fileStorage instanceof AliyunOssFileStorage) {
      pre.setPartNumberMarker(null);
    }
    return chain.next(pre,fileStorage);
  }
}

输入图片说明

梦想i-XYW1171736840 梦想i 拥有者
回复 jlzhou
5个月前

感谢你的反馈

2334961 dongshuocheng 1654496354 dong
回复 梦想i 拥有者
1个月前

这个能手动配置最好

我刚才就遇到这个问题

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(3)
435568 jlzhou 1596593095 梦想i-XYW1171736840 2334961 dongshuocheng 1654496354
Java
1
https://gitee.com/dromara/x-file-storage.git
git@gitee.com:dromara/x-file-storage.git
dromara
x-file-storage
x-file-storage

搜索帮助

371d5123 14472233 46e8bd33 14472233