使用新版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
相关产品推荐
相关产品推荐

