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

使用新版Java AWS SDK下载S3存储桶文件无响应无报错问题

问题根因

你的代码无反馈、不报错、文件未生成,是几个明确的SDK使用错误导致的,和服务端权限、网络连通性无直接关系:

  • S3TransferManager 基于异步S3客户端实现,所有上传下载操作都是非阻塞异步执行的。你调用downloadFile后仅拿到了异步任务句柄FileDownload,既没有调用Future相关方法等待任务执行完成,也没有注册结果回调,main方法运行到末尾直接终止JVM进程,异步下载任务还没启动就被回收,自然没有任何输出。
  • 对象Key格式错误:S3兼容协议的对象Key不需要以/开头,你写的/60a34de171122c0cd4b286c3/17-06-2022/29371/01.jpg会被服务端识别为带前置斜杠的特殊Key,和Spaces中实际存储的对象Key不匹配,即便等待任务执行也会返回404错误。
  • 存在冗余无效代码:孤立行S3AsyncClient.builder().endpointOverride(URI.create("sgp1.digitaloceanspaces.com"));既没有指定HTTPS协议头,也没有将构建的客户端赋值给任何变量,完全不参与逻辑运行。
  • 配置参数不符合规范:minimumPartSizeInBytes设置为1000字节远低于S3协议要求的最小分段大小(5MB,即510241024字节),虽然小文件下载不会触发分段逻辑,但该配置属于无效错误配置。
修复后可运行代码
import java.net.URI;
import java.nio.file.Paths;
import java.time.Duration;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.transfer.s3.S3TransferManager;
import software.amazon.awssdk.transfer.s3.FileDownload;
import software.amazon.awssdk.transfer.s3.model.CompletedFileDownload;

public class TestDownload {

    public static void main(String[] args) {
        String bucket = "plezerjams";
        // 替换为你的真实访问密钥
        AwsBasicCredentials awsCreds = AwsBasicCredentials.create(
                "your-access-key",
                "your-secret-key");
        Region region = Region.of("sgp1");

        S3TransferManager transferManager = S3TransferManager.builder()
                .s3ClientConfiguration(cfg -> cfg
                        .credentialsProvider(StaticCredentialsProvider.create(awsCreds))
                        .region(region)
                        .endpointOverride(URI.create("https://sgp1.digitaloceanspaces.com"))
                        // 小文件场景无需手动调整吞吐量、分段大小参数,使用默认值即可
                )
                .build();

        try {
            FileDownload download = transferManager.downloadFile(requestBuilder -> requestBuilder
                    .destination(Paths.get("D:\\01.jpg"))
                    .getObjectRequest(objReqBuilder -> objReqBuilder
                            .bucket(bucket)
                            // 移除Key开头的前置斜杠
                            .key("60a34de171122c0cd4b286c3/17-06-2022/29371/01.jpg")
                    )
            );

            // 核心:阻塞等待异步下载任务完成,设置30秒超时
            CompletedFileDownload completedTask = download.completionFuture()
                    .get(Duration.ofSeconds(30));
            System.out.printf("下载完成,文件大小:%d 字节%n", completedTask.response().contentLength());
        } catch (Exception e) {
            // 打印完整异常栈方便定位问题
            System.err.println("下载执行失败:" + e.getMessage());
            e.printStackTrace();
        } finally {
            // 关闭客户端释放底层资源
            transferManager.close();
        }
    }
}
后续排查方向

如果修改后仍无法正常下载,按顺序检查:

  • 确认使用的AccessKey、SecretKey正确,且密钥对当前bucket持有s3:GetObject权限
  • 确认本地D:\盘有写入权限,不要将下载路径设置为需要管理员授权的系统目录
  • 确认本地网络可以正常访问DigitalOcean Spaces的sgp1区域端点,无防火墙、代理拦截请求
  • 如果返回404错误,直接到Spaces控制台核对对象的完整Key,不要漏写、多写路径层级
  • 不要手动在endpoint前拼接bucket名称,SDK会自动处理bucket路径拼接,错误配置endpoint会导致请求路由失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:24:24