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

如何获取Amazon S3存储桶根目录下的主文件夹列表

仅列出Amazon S3根目录下的主文件夹

要实现只列出S3存储桶根目录的主文件夹,核心是利用S3 API的Delimiter参数和响应里的CommonPrefixes字段——S3里的文件夹是虚拟概念,Delimiter='/'会让API把路径按斜杠分割,返回的CommonPrefixes就是一级目录的集合,不需要去处理Contents里的文件或子路径。

修正后的代码实现

getRootDirectories() {
  const rootPrefixes = [];
  const params = {
    Bucket: this.bucket,
    Prefix: '', // 根目录前缀为空
    Delimiter: '/' // 按斜杠分割路径
  };

  return new Promise((resolve, reject) => this._fetchRootPrefixes(
    resolve,
    reject,
    params,
    rootPrefixes
  ));
}

_fetchRootPrefixes(resolve, reject, params, rootPrefixes) {
  this.s3.listObjectsV2(params).promise()
    .then(({ CommonPrefixes, IsTruncated, NextContinuationToken }) => {
      // 收集所有一级目录前缀
      if (CommonPrefixes && CommonPrefixes.length > 0) {
        rootPrefixes.push(...CommonPrefixes.map(prefix => ({
          name: prefix.Prefix.slice(0, -1), // 去掉末尾的斜杠,得到文件夹名称
          prefix: prefix.Prefix
        })));
      }

      // 处理分页,继续获取剩余结果
      if (IsTruncated) {
        this._fetchRootPrefixes(
          resolve,
          reject,
          Object.assign(params, { ContinuationToken: NextContinuationToken }),
          rootPrefixes
        );
      } else {
        resolve(rootPrefixes);
      }
    })
    .catch(reject);
}

关键说明

  • 参数配置:Prefix设为空字符串表示从根目录开始,Delimiter='/'是核心,它会让API返回所有一级目录的前缀(即主文件夹),而不会返回子目录或文件。
  • 处理响应:CommonPrefixes里的每个元素包含Prefix字段(比如Test/),我们可以通过slice(0, -1)去掉末尾的斜杠,得到纯文件夹名称。
  • 分页处理:如果结果被截断(IsTruncated=true),需要带上NextContinuationToken继续请求,直到获取全部主文件夹。

原代码的问题

  1. Prefix和Delimiter设置错误:你之前把两者都设为Test/,这会只列出Test/路径下的内容,而不是根目录的所有主文件夹。
  2. 错误使用Contents:Contents包含的是所有匹配前缀的文件和“文件夹对象”(如果手动创建过文件夹的话),但无法准确区分一级目录和子目录,而CommonPrefixes才是专门用来获取分隔后的前缀集合的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:35:33