ListObjectsV2 - 仅获取 S3 存储桶中的文件夹

Jan*_*čka 7 amazon-s3 amazon-web-services aws-sdk-js

我正在使用AWS S3 JS SDK。我的 S3 存储桶中的文件夹内有文件夹,我想仅列出特定级别的文件夹。

这是结构:

bucket/folder1/folder2/folder3a/file1
bucket/folder1/folder2/folder3a/file2
bucket/folder1/folder2/folder3a/file3
bucket/folder1/folder2/folder3a/...

bucket/folder1/folder2/folder3b/file1
bucket/folder1/folder2/folder3b/file2
bucket/folder1/folder2/folder3b/file3
bucket/folder1/folder2/folder3b/...

bucket/folder1/folder2/folder3c/file1
bucket/folder1/folder2/folder3c/file2
bucket/folder1/folder2/folder3c/file3
bucket/folder1/folder2/folder3c/...
Run Code Online (Sandbox Code Playgroud)

如您所见,在文件夹 3 的级别,我有多个文件夹,每个文件夹都包含多个项目。我不关心这些物品。我只想列出第 3 级的文件夹名称。有没有好的方法可以做到这一点?

我发现的唯一方法是使用ListObjectsV2。但这也给了我一些导致结果集膨胀的文件,之后我需要进行手动过滤。有没有办法在 API 级别只获取文件夹名称?

Jan*_*čka 16

这篇文章回答了我所有的问题。https://realguess.net/2014/05/24/amazon-s3-delimiter-and-prefix/

解决方案可以使用前缀和分隔符的组合来完成。在我的示例中,参数应包含以下内容:

const params = {
      Bucket: 'bucket',
      Prefix: 'folder1/folder2/',
      Delimiter: '/',
    };
Run Code Online (Sandbox Code Playgroud)

请务必不要忘记 Prefix 参数末尾的斜杠。

文件夹列表将位于CommonPrefixes响应对象的属性中。

给你一个现实生活中的例子:

...
const params = {
      Bucket: bucketName,
      Prefix: prefix + '/',
      MaxKeys: 25,
      Delimiter: '/',
    };
const command = new ListObjectsV2Command(params);
const results = await s3client.send(command);
const foldersList = results.CommonPrefixes;
...
Run Code Online (Sandbox Code Playgroud)