我需要列出我的 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 许可协议
S3 中的一切都是对象。对您来说,它可能是文件和文件夹。但对于 S3,它们只是对象。
以分隔符结尾的对象(大多数情况下为
/
)通常被视为文件夹,但并非总是如此。这取决于应用程序。同样,在您的情况下,您将其解释为文件夹。 S3 不是。这只是另一个对象。在上述情况下,对象
users/<user-id>/contacts/<contact-id>/
作为不同的对象存在于 S3 中,但对象users/<user-id>/
不存在。这就是你的反应的不同。为什么它们会这样,我们不能告诉你,但在一种情况下有人制造了这个物体,而在另一种情况下却没有。您在 AWS 管理控制台中看不到它,因为控制台将其解释为文件夹并将其隐藏起来。由于 S3 只是将这些事物视为对象,因此它不会为您“排除”某些事物。由客户来处理应该处理的对象。
您的解决方案
由于您是不想要文件夹对象的人,因此您可以通过检查
/
的最后一个字符来自己排除它。如果是,则忽略响应中的对象。