当前位置: 首页 > 面试题库 >

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

景昊焜
2023-03-14
问题内容

我需要列出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中的所有内容都是对象。对您来说,它可能是文件和文件夹。但是对于S3来说,它们只是对象。

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

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

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

您的解决方案

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



 类似资料:
  • 问题内容: 我有一个s3结构,如下所示: 我需要做的就是给定s3bucket的名称和一个第一级密钥的条目,我需要位于第一级密钥下的所有第二级密钥的名称。因此,从本质上来说,如果我们将其视为一个文件夹,则将获得的名称(即)和其子文件夹之一的名称,我想列出其中的所有文件夹。虽然只是名称,而不是完整的路径。 有人可以指出如何使用亚马逊的Java SDK在Java中做到这一点吗? 谢谢 问题答案: 我做了

  • 我有一个Amazon S3存储桶,所有设置都处于默认模式。当我转到我的Bucket权限选项卡并查看Public access/Everyone部分时,所有选项都为空,因此所有内容都是私有的。 现在我制作一个带有很长随机sha1-hash的文件夹,我在这个文件夹中上传一些文件和子文件夹,并将整个文件夹公开。是否可以检测(列出)此文件夹? 看起来不错。但也许还有其他方法可以检测我的公用文件夹?

  • 这可以通过元数据实现吗?当在父文件夹中创建一个新文件/文件夹时,我是否也可以通过编程方式更新父文件夹的元数据,以便说:“嘿,在这个文件夹中有这些特定的文件?”

  • 我是Google Cloud Platform的新手。我已经在datalab上训练了我的模型,并将模型文件夹保存在云存储中。我可以通过右键单击文件将桶中的现有文件下载到本地计算机-

  • 有没有一种方法可以将文件列表从一个S3存储桶复制到另一个存储桶?两个S3存储桶都在同一个AWS帐户中。我可以使用aws cli命令一次复制一个文件: 然而,我有1000份文件要复制。我不想复制源存储桶中的所有文件,因此无法使用sync命令。有没有一种方法可以用需要复制的文件名列表来调用一个文件,从而自动化这个过程?

  • 在我的例子中,我有一个Url列表,我想从这些Url中下载每个文件并将其组织到firebase存储桶中,我的问题是我无法通过nodejs JavaScript/TypeScript在firebase存储桶中创建文件夹。 任何帮助将非常感谢,我的代码片段到目前为止是从他们的文档和上传文件正确: 所有我想要的是保存音频文件在文件夹桶,而不是在桶根