有没有人成功阅读S3存储桶作为子文件夹?
folder1中
- 子文件夹2
---- file3
---- file4
- file1
- file2
文件夹2
- 子文件夹3
- file5
- file6
我的任务是阅读folder1。我希望看到subfolder2,file1和file2,但不是file3或file4。现在,因为我将存储桶密钥限制为prefix => 'folder1 /',你仍然得到file3和4,因为它们在技术上具有folder1前缀。
真正做到这一点的唯一方法就是吮吸folder1下的所有键,然后使用字符串搜索实际排除结果数组中的file3和file4。
有没有人有这方面的经验?我知道像TRANS和Cyberduck这样的FTP风格的S3客户端必须这样做但是从S3 API本身并不明显。
非常感谢, 康拉德
我查看了AWS :: S3和right_aws。
答案 0 :(得分:6)
S3 API没有文件夹的概念。但是,它允许文件名中包含“/”,并允许您使用前缀进行查询。你似乎已经熟悉了,但只是想清楚。
当您使用前缀folder1/
进行查询时,S3将返回该“文件夹”下的所有内容。为了只操纵直接后代,你将不得不在Ruby中自己过滤结果(选择你的毒药:reject
或select
)。这不会有助于提高性能(在S3中使用“文件夹”的常见原因),但它可以完成工作。
答案 1 :(得分:0)
您遇到了S3 API的限制,唯一的方法是在客户端上进行过滤。
最好的(也是最高性能的)选项是在数据库/ xml文件等中“镜像”您的S3存储结构,然后进行查询。然后,当用户找到他们想要的文件时,只需从S3检索文件。
答案 2 :(得分:0)
以下是使用带有S3驱动程序的虚拟文件系统的示例。
如前所述S3没有文件夹的概念,但它提供伪造它的能力。虚拟文件系统使用这些功能为您提供“虚拟文件夹”
答案 3 :(得分:0)
更新:适用于AWS SDK的第二版
亚马逊现在已经创建了允许“前缀搜索”的迭代器。可以使用它来模拟目录/文件夹结构。在上面的示例中(在PHP中),以下内容应该有效:
$client = S3Client::factory(array(
'key' => $this->aKey,
'secret' => $this->sKey,
'region' => $this->region,
));
$iterator = $client->getIterator('ListObjects', array(
'Bucket' => 'folder1',
'Prefix' => 'subfolder2/', // supposing that the forward slash has been used to emulate diretcories
));
foreach ($iterator as $object) {
echo $object['Key'] . "\n"; // will echo only file 3 and file 4
}