You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用S3 Transfer Manager复制对象遇301错误及进度展示问题求助

解决方案:S3 Transfer Manager Copy 301重定向错误

错误原因分析

S3返回301状态码通常意味着请求的存储桶端点与实际桶所在区域不匹配,或者请求的访问样式(虚拟主机/路径样式)不符合桶名规则,导致服务端触发重定向,但SDK未正确处理该重定向逻辑。

具体修复步骤

  • 确认桶区域与客户端配置一致
    检查源桶和目标桶的实际部署区域,确保代码中配置的Region.EU_WEST_1与桶所在区域完全匹配。如果是跨区域复制场景,需在复制请求中单独指定源桶的区域。

  • 开启重定向跟随与路径样式访问
    在S3客户端配置中显式开启重定向跟随,并强制使用路径样式访问(解决桶名含点号等特殊字符时的虚拟主机样式兼容问题):

    S3ClientConfiguration.builder()
            .region(Region.EU_WEST_1)
            .credentialsProvider(awsCredentialsProvider)
            .enableRedirects(true) // 开启重定向跟随
            .pathStyleAccessEnabled(true) // 强制路径样式访问
            .build()
    
  • 跨区域复制需指定源桶区域
    如果源桶和目标桶不在同一区域,必须在copyObjectRequest中明确指定源桶的实际区域:

    .copyObjectRequest(r -> r
            .sourceBucket("source_bucket")
            .sourceKey("test.json")
            .sourceRegion(Region.US_EAST_1) // 替换为源桶实际区域
            .destinationBucket("destination_bucket")
            .destinationKey("test.json")
    )
    

修改后的完整代码示例

public static void test(){
    try {
        String sAccessKey="XXXXX";
        String sSecretKey="XXXXXX";
        AwsBasicCredentials awsCreds = AwsBasicCredentials.create(
                sAccessKey,
                sSecretKey);
        AwsCredentialsProvider awsCredentialsProvider =  StaticCredentialsProvider.create(awsCreds);
        S3TransferManager s3TransferManager = S3TransferManager
                .builder()
                .s3ClientConfiguration(S3ClientConfiguration.builder()
                        .region(Region.EU_WEST_1)
                        .credentialsProvider(awsCredentialsProvider)
                        .enableRedirects(true)
                        .pathStyleAccessEnabled(true)
                        .build())
                .build();
      
        Copy copy = s3TransferManager.copy(c -> c
                        .copyObjectRequest(r -> r
                                .sourceBucket("source_bucket")
                                .sourceKey("test.json")
                                // 跨区域复制时取消注释并替换为源桶实际区域
                                // .sourceRegion(Region.US_EAST_1)
                                .destinationBucket("destination_bucket")
                                .destinationKey("test.json"))
                 .overrideConfiguration(o -> o.addListener( LoggingTransferListener.create()))
        );
        CompletedCopy completedCopy = copy.completionFuture().join();
        System.out.println(copy.progress().snapshot().transferSizeInBytes());
        System.out.println(copy.progress().snapshot().bytesTransferred());

    } catch (S3Exception e) {
        throw e;
    }
}

额外检查项

  • 确认IAM权限包含s3:CopyObject、s3:GetObject(源桶权限)和s3:PutObject(目标桶权限);
  • 检查桶名是否符合AWS S3命名规范(无大写字母、特殊字符需符合DNS规则)。

内容的提问来源于stack exchange,提问作者santosh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 23:05:25