性感的煎鸡蛋 · PostgreSQL连接python,pos ...· 2 月前 · |
聪明伶俐的脸盆 · 在Ruby中创建二维数组并访问子数组_问答- ...· 2 月前 · |
体贴的牛腩 · Meta AI 开源1750亿参数大模型- ...· 1 年前 · |
才高八斗的哑铃 · Java语言实战开发 @网络聊天室 (二) ...· 1 年前 · |
傲视众生的玉米 · 日期的单词元素,以及如何实现点击按钮显示当前 ...· 1 年前 · |
我需要列出包含在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>/
我为什么会有这种行为?两种上市请求之间有什么不同?我只需要列出目录中的文件,不包括子目录.
发布于 2016-06-27 13:29:41
S3中的所有东西都是一个对象。对你来说,可能是文件和文件夹。但对S3来说,它们只是物体。
以分隔符结尾的对象(大多数情况下为
/
)通常被视为文件夹,但情况并不总是如此。这取决于应用程序。同样,在您的例子中,您将它解释为一个文件夹。S3不是。只是另一个物体。
在上面的例子中,对象
users/<user-id>/contacts/<contact-id>/
作为一个独立的对象在S3中存在,但是对象
users/<user-id>/
不存在。这就是你回答的不同之处。为什么他们是那样的,我们不能告诉你,但在一个情况下,有人制造了物体,而在另一个情况下没有。您不会在AWS管理控制台中看到它,因为控制台将其解释为文件夹,并将其隐藏起来。
因为S3只是将这些东西视为对象,所以它不会为您“排除”某些东西。应该由客户端来处理应该处理的对象。
您的解决方案
由于您不需要文件夹对象,所以您可以通过检查
/
的最后一个字符来排除它。如果是,则忽略响应中的对象。
发布于 2016-09-15 20:48:48
虽然每个人都说s3中没有目录和文件,但是只有对象(和桶),这是绝对正确的,我建议利用CommonPrefixes,在 this 答案中描述。因此,您可以按照以下步骤获取“文件夹”(commonPrefixes)和“文件”(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 (文件),它应该返回(如果前缀正确):
用户/用户-id/联系人/联系人-id/file1.txt
用户/用户-id/联系人/联系人-id/file2.txt
对于commonPrefixes:
用户/用户id/联系人/联系人/id/
参考资料: ListObjectsV2.html
发布于 2020-11-03 15:32:07
如果您的目标只是获取文件而不是文件夹,那么我所做的方法就是使用文件
size
作为筛选器。此属性是AWS承载的文件的当前大小。该属性中的所有文件夹返回0。下面是一个使用linq的C#代码,但是它应该不难转换成Java。
var amazonClient = new AmazonS3Client(key, secretKey, region);
var listObjectsRequest= new ListObjectsRequest