java - 列出 AWS S3 存储桶的特定 "folder"中的文件

标签 java amazon-web-services amazon-s3

我需要列出我的 S3 存储桶中某个文件夹中包含的所有文件。

文件夹结构如下

/my-bucket/users/<user-id>/contacts/<contact-id>

我有与用户相关的文件和与某个用户的联系人相关的文件。 我需要同时列出两者。

要列出我正在使用此代码的文件:

ListObjectsRequest listObjectsRequest = new ListObjectsRequest().withBucketName("my-bucket")
                .withPrefix("some-prefix").withDelimiter("/");
ObjectListing objects = transferManager.getAmazonS3Client().listObjects(listObjectsRequest);

为了列出某个用户的文件,我使用了这个前缀:

users/<user-id>/

并且我正确地获取了目录中的所有文件,不包括 contacts子目录,例如:

users/<user-id>/file1.txt
users/<user-id>/file2.txt
users/<user-id>/file3.txt

为了列出某个用户联系人的文件,我使用了这个前缀:

users/<user-id>/contacts/<contact-id>/

但在这种情况下,我也得到了 目录本身作为返回的对象:

users/<user-id>/contacts/<contact-id>/file1.txt
users/<user-id>/contacts/<contact-id>/file2.txt
users/<user-id>/contacts/<contact-id>/

为什么我会出现这种行为?两个列表请求之间有什么不同?我只需要列出目录中的文件,不包括子目录。

最佳答案

虽然每个人都说 s3 中没有目录和文件,而只有对象(和存储桶),这是绝对正确的,但我建议利用 this 中描述的 CommonPrefixes。回答。 因此,您可以执行以下操作来获取“文件夹”(commonPrefixes)和"file"(objectSummaries)列表:

ListObjectsV2Request req = new ListObjectsV2Request().withBucketName(bucket.getName()).withPrefix(prefix).withDelimiter(DELIMITER);
ListObjectsV2Result listing = s3Client.listObjectsV2(req);
for (String commonPrefix : listing.getCommonPrefixes()) {
        System.out.println(commonPrefix);
}
for (S3ObjectSummary summary: listing.getObjectSummaries()) {
    System.out.println(summary.getKey());
}

在您的情况下,对于 objectSummaries(文件),它应该返回(如果前缀正确):
users/user-id/contacts/contact-id/file1.txt
users/user-id/contacts/contact-id/file2.txt

常用前缀:
users/user-id/contacts/contact-id/

引用:https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html

关于java - 列出 AWS S3 存储桶的特定 "folder"中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38051789/

相关文章:

java - 在Java中使用 "final"参数线程安全

amazon-web-services - 如何将路由表链接到Azure Bicep中的子网?给出的代码示例

ruby-on-rails - 将图像从 Rails 应用程序上传到 Amazon S3 时,采取哪条最佳路线?

php - 使用适用于 PHP 的 AWS 开发工具包以编程方式将文件夹添加到 S3

java - 从链表中的值中查找节点

java - 如何在 Intellij IDEA 的子类上下文中为重写自动完成显示方法建议?

amazon-web-services - EC2 实例无法在 VPC 中连接到自身

powershell - 写入Amazon AWS S3时排除文件或某些类型

java - JUnit:具有私有(private)字段的测试生成器

android - 使用 Amazon SNS 服务发送推送通知