列出 AWS 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>/

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

原文由 davioooh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.3k
2 个回答

S3 中的一切都是对象。对您来说,它可能是文件和文件夹。但对于 S3,它们只是对象。

以分隔符结尾的对象(大多数情况下为 / )通常被视为文件夹,但并非总是如此。这取决于应用程序。同样,在您的情况下,您将其解释为文件夹。 S3 不是。这只是另一个对象。

在上述情况下,对象 users/<user-id>/contacts/<contact-id>/ 作为不同的对象存在于 S3 中,但对象 users/<user-id>/ 不存在。这就是你的反应的不同。为什么它们会这样,我们不能告诉你,但在一种情况下有人制造了这个物体,而在另一种情况下却没有。您在 AWS 管理控制台中看不到它,因为控制台将其解释为文件夹并将其隐藏起来。

由于 S3 只是将这些事物视为对象,因此它不会为您“排除”某些事物。由客户来处理应该处理的对象。

您的解决方案

由于您是不想要文件夹对象的人,因此您可以通过检查 / 的最后一个字符来自己排除它。如果是,则忽略响应中的对象。

原文由 Matt Houser 发布,翻译遵循 CC BY-SA 4.0 许可协议

虽然每个人都说 s3 中没有目录和文件,只有对象(和存储桶),这是绝对正确的,但我建议利用 答案中描述的 CommonPrefixes。因此,您可以执行以下操作以获取“文件夹”(commonPrefixes)和“文件”(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(文件),它应该返回(如果前缀正确):

用户/用户ID/联系人/联系人ID/file1.txt

用户/用户 ID/联系人/联系人 ID/file2.txt

对于通用前缀:

用户/用户 ID/联系人/联系人 ID/

参考: https ://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html

原文由 Vic K 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题