【发布时间】:2016-10-29 08:08:52
【问题描述】:
我需要列出我的 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>/
为什么我会出现这种行为?两个列表请求之间有什么不同?我只需要列出目录中的文件,不包括子目录。
【问题讨论】:
-
如果您实际上在控制台中创建了“空文件夹”,则会出现这种行为,因为该操作实际上创建了一个带有键
path/to/my/folder/的空对象,因此控制台有一个占位符。你在测试时这样做了吗? -
@Michael-sqlbot 我没有创建任何空文件夹。事实上,所有文件都是由应用程序使用我报告为文件键前缀的文件夹结构上传的。
-
您可能想在带有斜杠的明显对象上尝试
GET,因为如果您没有创建文件夹并且在列出时确实使用了/分隔符withDelimiter("/")对象,这应该意味着您实际上确实有一个以斜杠命名的对象,这可能是由于您的代码中的一个错误以这种方式创建了一个。这样的对象可能在控制台中是不可见的。 -
确实,Michael 是对的,您的存储桶中有一个具有该键的对象。运行此命令将其删除
aws s3api delete-object --bucket X --key path/to/my/folder/。并确保您的代码不会再次创建该对象。
标签: java amazon-web-services amazon-s3