我需要列出我的 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 中没有目录和文件,而只有对象(和存储桶),这是绝对正确的,但我建议利用 this 中描述的 CommonPrefixes。回答。 因此,您可以执行以下操作来获取“文件夹”(commonPrefixes)和"file"(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(文件),它应该返回(如果前缀正确):
users/user-id/contacts/contact-id/file1.txt
users/user-id/contacts/contact-id/file2.txt
常用前缀:
users/user-id/contacts/contact-id/
引用:https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html
关于java - 列出 AWS S3 存储桶的特定 "folder"中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38051789/