首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >列出AWS S3桶的特定“文件夹”中的文件

列出AWS S3桶的特定“文件夹”中的文件
EN

Stack Overflow用户
提问于 2016-06-27 10:38:04
回答 7查看 167.8K关注 0票数 97

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

文件夹结构如下

代码语言:javascript
运行
复制
/my-bucket/users/<user-id>/contacts/<contact-id>

我有与用户相关的文件和与某个用户的联系人相关的文件。我要把这两样都列出来。

要列出文件,我使用以下代码:

代码语言:javascript
运行
复制
ListObjectsRequest listObjectsRequest = new ListObjectsRequest().withBucketName("my-bucket")
                .withPrefix("some-prefix").withDelimiter("/");
ObjectListing objects = transferManager.getAmazonS3Client().listObjects(listObjectsRequest);

为了列出特定用户的文件,我使用了以下前缀:

users/<user-id>/

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

代码语言:javascript
运行
复制
users/<user-id>/file1.txt
users/<user-id>/file2.txt
users/<user-id>/file3.txt

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

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

但在本例中,我还将目录本身作为返回的对象:

代码语言:javascript
运行
复制
users/<user-id>/contacts/<contact-id>/file1.txt
users/<user-id>/contacts/<contact-id>/file2.txt
users/<user-id>/contacts/<contact-id>/

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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2016-06-27 13:29:41

S3中的所有东西都是一个对象。对你来说,可能是文件和文件夹。但对S3来说,它们只是物体。

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

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

因为S3只是将这些东西视为对象,所以它不会为您“排除”某些东西。应该由客户端来处理应该处理的对象。

您的解决方案

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

票数 54
EN

Stack Overflow用户

发布于 2016-09-15 20:48:48

虽然每个人都说s3中没有目录和文件,但是只有对象(和桶),这是绝对正确的,我建议利用CommonPrefixes,在this答案中描述。因此,您可以按照以下步骤获取“文件夹”(commonPrefixes)和“文件”(ObjectSummaries)的列表:

代码语言:javascript
运行
复制
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

对于commonPrefixes:

用户/用户id/联系人/联系人/id/

参考资料:ListObjectsV2.html

票数 69
EN

Stack Overflow用户

发布于 2020-11-03 15:32:07

如果您的目标只是获取文件而不是文件夹,那么我所做的方法就是使用文件size作为筛选器。此属性是AWS承载的文件的当前大小。该属性中的所有文件夹返回0。下面是一个使用linq的C#代码,但是它应该不难转换成Java。

代码语言:javascript
运行
复制
var amazonClient = new AmazonS3Client(key, secretKey, region);
var listObjectsRequest= new ListObjectsRequest
            {
                BucketName = 'someBucketName',
                Delimiter = 'someDelimiter',
                Prefix = 'somePrefix'
            };
var objects = amazonClient.ListObjects(listObjectsRequest);
var objectsInFolder = objects.S3Objects.Where(file => file.Size > 0).ToList();
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38051789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档