Как бы вы прочитали S3 как иерархическую структуру каталогов в Ruby? - PullRequest
6 голосов
/ 25 января 2011

У кого-нибудь был успех при чтении сегментов S3 как подпапок?

folder1

- subfolder2

---- file3

---- файл4

- файл1

- файл2

папка2

- подпапка3

- файл5

- file6

Моя задача - прочитать folder1.Я ожидаю увидеть подпапку2, файл1 и файл2, но НЕ файл3 или файл4.Прямо сейчас, поскольку я ограничиваю ключи корзины префиксом => 'folder1 /', вы все равно получаете file3 и 4, так как они технически имеют префикс folder1.

Кажется, единственный способ действительно сделать это - засосатьвсе ключи в папке folder1, а затем используйте поиск строк, чтобы фактически исключить file3 и file4 из массива результатов.

Кто-нибудь имел опыт в этом?Я знаю, что клиенты S3 в стиле FTP, такие как Transmit и Cyberduck, должны это делать, но это не видно из самого API S3.

Спасибо, Конрад

Я рассмотрел оба AWS ::S3 и right_aws.

Ответы [ 4 ]

6 голосов
/ 25 января 2011

S3 API не имеет представления о папке.Однако он допускает имена файлов с символом «/» в них и позволяет выполнять запросы с префиксом.Похоже, вы уже знакомы с этим, но просто хотели прояснить ситуацию.

Когда вы делаете запрос с префиксом folder1/, S3 собирается вернуть все в этой «папке».Чтобы манипулировать только прямыми потомками, вам нужно будет отфильтровать результаты самостоятельно в Ruby (выберите яд: reject или select).Это не повлияет на производительность (частая причина использовать «папки» в S3), но оно выполняет свою работу.

1 голос
/ 06 мая 2013

Обновление: для версии II пакета AWS SDK

Amazon теперь создала итераторы, которые позволяют выполнять поиск с префиксом.Это можно использовать для эмуляции структуры каталогов / папок.В приведенном выше примере (в 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
}
1 голос
/ 25 января 2011

Вы столкнулись с ограничением API S3, и единственный способ сделать это - выполнить фильтрацию на клиенте.

Лучшим (и наиболее эффективным) вариантом будет «зеркалирование» вашей структуры хранения S3 в файле базы данных / xml и т. Д., И вместо этого вы будете делать запросы. Затем просто получите файлы из S3, когда пользователь найдет нужные им файлы.

0 голосов
/ 11 сентября 2011

Вот пример использования виртуальной файловой системы с драйвером S3.

Как уже говорилось, S3 не имеет понятия о папке, но предоставляет возможность ее подделать. Виртуальная файловая система использует эти возможности для предоставления вам «виртуальной папки»

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...