如何获取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继续请求,直到获取全部主文件夹。
原代码的问题
Prefix和Delimiter设置错误:你之前把两者都设为Test/,这会只列出Test/路径下的内容,而不是根目录的所有主文件夹。- 错误使用
Contents:Contents包含的是所有匹配前缀的文件和“文件夹对象”(如果手动创建过文件夹的话),但无法准确区分一级目录和子目录,而CommonPrefixes才是专门用来获取分隔后的前缀集合的。
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

