在AWS S3存储桶的特定“文件夹”中列出文件

davioooh:

我需要列出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>/

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

Matt Houser:

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

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

在上述情况下,该对象users/<user-id>/contacts/<contact-id>/在S3中作为一个不同的对象存在,但该对象users/<user-id>/不存在。那就是您的回答不同。他们为什么会这样,我们无法告诉您,但是有人在一种情况下制造了该物品,而在另一种情况下则没有。您不会在AWS Management Console中看到它,因为该控制台会将其解释为文件夹并向您隐藏。

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

您的解决方案

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章