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

如何用Java根据文件扩展名从Amazon S3下载单个文件

问题

我拥有一个Amazon S3存储桶,其中仅包含一个文件,希望通过文件扩展名实现该单个文件的下载。目前我已有通过Key下载多个文件并按扩展名过滤的代码(如下所示):

s3.listObjects(operaBucketName, keyName)
          .getObjectSummaries()
          .forEach(s -> keys.add(s.getKey()));
List<String> filteredKeys =
        keys.stream().filter(s -> s.contains(extension)).collect(Collectors.toList());
//add to file list
List<File> files = new ArrayList<>();
    for (String key : filteredKeys) {
      File file = new File(FilenameUtils.getFullPath(localDirectory) + FilenameUtils.getName(key));
      downloadFileFromS3(operaBucketName, key, file);
      files.add(file);
    }

我尝试使用s3.getObject(operaBucketName, keyName);方法,但com.amazonaws.services.s3.model.S3Object无法检查文件扩展名。我了解可以通过相关方法将S3Object内容写入文件,同时想咨询:若指定的S3路径(Key)下存在多个文件,getObject方法是否会抛出异常?

使用的SDK版本:

<dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-java-sdk-s3</artifactId>
      <version>1.11.792</version>
    </dependency>
回答
  • 关于getObject的异常情况:S3的Key是对象的唯一标识符,不存在“指定Key下有多个文件”的场景。S3里的“路径”只是Key的命名习惯(用/分隔模拟层级),本质上每个Key对应唯一的一个存储对象。如果调用getObject时传入的Key不存在,会抛出AmazonS3Exception(错误码通常为NoSuchKey);如果Key存在,无论其命名是否包含/,都会返回对应的单个对象,不会因为Key看起来像“路径”就返回多个对象。
  • 针对单文件按扩展名下载的优化方案:因为存储桶里只有一个文件,你可以直接调用listObjects获取桶内所有对象(无需指定前缀keyName),再过滤出符合目标扩展名的Key,之后调用getObject下载即可。由于只有一个文件,过滤后直接取第一个元素就能拿到目标Key。
  • 检查S3对象的扩展名:无需通过S3Object本身检查,直接从对象的Key中提取扩展名即可,比如用你代码里已经用到的FilenameUtils.getExtension(s.getKey())来判断是否匹配目标扩展名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 02:33:23