Я пытаюсь получить список объектов в ведре в организованный список с папками и файлами.Как получить 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
?
Вот почему мне не нравится документация Амазонки. Сработает ли это с 'getListObjectsIterator'? В ссылке, о которой я упоминал, существует различие между массивом «CommonPrefixes» и массивом 'Содержание'. Разве нет способа получить «CommonPrefixes» через '$ iterator-> get()' или что-то еще? – xaddict
Мне жаль, что вам не нравятся документы, но это скорее странный крайный кейс для итераторов. Если у вас есть предложения по улучшению документов, пожалуйста, сообщите нам об этом в нашем журнале. Да, 'getIterator ('OPERATION', [PARAMS], [ITERATOR_OPTS])' такой же, как 'get Iterator ([PARAMS], [ITERATOR_OPTS])'. Если вы хотите иметь дело с * только * 'CommonPrefixes', вы должны просто использовать простой API. В общем, итераторы должны излучать только один тип вещей. Поскольку это операция «ListObjects», итератор испускает объекты S3. Возможность получить CommonPrefixes также является дополнительной функцией. –
Вы можете вырезать итератор и выполнить '$ result = $ client-> listBuckets ([/ * ... * /]); $ prefixes = $ result-> get ('CommonPrefixes'); ', но если у вас более 1000 объектов/префиксов, вы должны сделать больше запросов с' 'Marker '', чтобы получить остальное. –