2014-01-15 3 views
3

Я пытаюсь получить список объектов в ведре в организованный список с папками и файлами.Как получить CommonPrefixes из Amazon S3 ListObjects Iterator

В документации, S3 Listing Keys Hierarchically Using Prefix and Delimiter, Amazon утверждает, что, когда есть другие каталоги в выбранном каталоге:

Amazon S3 группы эти ключи и возвращают один CommonPrefixes элемент

У меня есть следующий код:

$iterator = $client->getIterator(
    'ListObjects', 
    array(
     'Bucket' => $bucket, 
     'Prefix' => $dir, 
     'Delimiter' => '/' 
    ) 
); 

который делает хорошую работу. Он получает все объекты в ведре (в отличие от метода низкого уровня ListObjects, который возвращает максимум 1000 объектов) и отображает их в алфавитном порядке.

Если я скажу это итератор возвращать array так:

$objects = $iterator->toArray(); 

можно затем использовать эту array в foreach петле

foreach ($objects as $object) { 
    echo $object['Key'] . "<br/>\n"; 
} 

, который дает мне все указатели на файлы:

  • Папка/подпапка/file.ext
  • папки/подпапки/file2.ext
  • папки/подпапки/file3.ext
  • папки/подпапки/file4.ext
  • папки/подпапки/file5.ext

Это не показывая другие каталоги в этом каталоге.

Телефонный звонок $iterator->get('CommonPrefixes') возвращается null. Любые другие операции с переменной $iterator приводят к краху кода.

Как я могу получить доступ к полному набору ответов в ListBucketResult?

ответ

6

Метод getIterator() имеет третий параметр для параметров, специфичных для объекта итератора. Итератор S3 ListObjects на самом деле является конкретным классом и указывает некоторые пользовательские параметры в своих документах: return_prefixes, sort_results и names_only (см. http://docs.aws.amazon.com/aws-sdk-php/latest/class-Aws.S3.Iterator.ListObjectsIterator.html). Используйте return_prefixes, чтобы получить CommonPrefixes, смешанные с объектами. Попробуйте следующее:

$iterator = $client->getIterator(
    'ListObjects', 
    array(
     'Bucket' => $bucket, 
     'Prefix' => $dir, 
     'Delimiter' => '/' 
    ), 
    array(
     'return_prefixes' => true, 
    ), 
); 

foreach ($iterator as $object) { 
    if (isset($object['Prefix'])) { 
     // For Common Prefixes 
     echo $object['Prefix'] . "<br/>\n"; 
    } else { 
     // For Objects 
     echo $object['Key'] . "<br/>\n"; 
    } 
} 

// Also Licensed under version 2.0 of the Apache License. 
+0

Вот почему мне не нравится документация Амазонки. Сработает ли это с 'getListObjectsIterator'? В ссылке, о которой я упоминал, существует различие между массивом «CommonPrefixes» и массивом 'Содержание'. Разве нет способа получить «CommonPrefixes» через '$ iterator-> get()' или что-то еще? – xaddict

+0

Мне жаль, что вам не нравятся документы, но это скорее странный крайный кейс для итераторов. Если у вас есть предложения по улучшению документов, пожалуйста, сообщите нам об этом в нашем журнале. Да, 'getIterator ('OPERATION', [PARAMS], [ITERATOR_OPTS])' такой же, как 'get Iterator ([PARAMS], [ITERATOR_OPTS])'. Если вы хотите иметь дело с * только * 'CommonPrefixes', вы должны просто использовать простой API. В общем, итераторы должны излучать только один тип вещей. Поскольку это операция «ListObjects», итератор испускает объекты S3. Возможность получить CommonPrefixes также является дополнительной функцией. –

+0

Вы можете вырезать итератор и выполнить '$ result = $ client-> listBuckets ([/ * ... * /]); $ prefixes = $ result-> get ('CommonPrefixes'); ', но если у вас более 1000 объектов/префиксов, вы должны сделать больше запросов с' 'Marker '', чтобы получить остальное. –

 Смежные вопросы

  • Нет связанных вопросов^_^