您如何阅读S3作为Ruby中的分层目录结构?

时间:2011-01-24 23:15:24

标签: ruby amazon-s3

有没有人成功阅读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和Cyber​​duck这样的FTP风格的S3客户端必须这样做但是从S3 API本身并不明显。

非常感谢, 康拉德

我查看了AWS :: S3和right_aws。

4 个答案:

答案 0 :(得分:6)

S3 API没有文件夹的概念。但是,它允许文件名中包含“/”,并允许您使用前缀进行查询。你似乎已经熟悉了,但只是想清楚。

当您使用前缀folder1/进行查询时,S3将返回该“文件夹”下的所有内容。为了只操纵直接后代,你将不得不在Ruby中自己过滤结果(选择你的毒药:rejectselect)。这不会有助于提高性能(在S3中使用“文件夹”的常见原因),但它可以完成工作。

答案 1 :(得分:0)

您遇到了S3 API的限制,唯一的方法是在客户端上进行过滤。

最好的(也是最高性能的)选项是在数据库/ xml文件等中“镜像”您的S3存储结构,然后进行查询。然后,当用户找到他们想要的文件时,只需从S3检索文件。

答案 2 :(得分:0)

以下是使用带有S3驱动程序的虚拟文件系统的示例。

如前所述S3没有文件夹的概念,但它提供伪造它的能力。虚拟文件系统使用这些功能为您提供“虚拟文件夹”

http://alexeypetrushin.github.com/vfs/basics.html

http://alexeypetrushin.github.com/vfs/s3_basics.html

答案 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
}