Получить список только корневых объектов (папок) в S3 - aws sdk v3 php

учитывая мое ведро S3, которое содержит изображения в такой структуре:

root/portraits/portrait_001.jpg
root/landscapes/landscape_001.jpg

где root - мое ведро, и в моем корне нет других файлов, только эти папки (объекты), как мне получить список только этих объектов?

portraits/
landscapes/

Я знаком с использованием разделителя и префикса в вызове ListObjects.

если я сделаю следующее, Я не получу никаких результатов:

$objects = $s3->getIterator('ListObjects', array(
    'Bucket' => $bucket,
    'Delimiter' => '/',
));

foreach($objects as $object)
    echo $object['Key'] . "n";

если я не использую разделитель, я получаю все, очевидно.

Я не могу использовать префикс, потому что объекты, которые я хочу, являются корневыми. В противном случае у меня нет проблем с использованием префикса, чтобы сказать, перечислите только файлы в 'portraits/'

из моих поисков мне удалось найти решения только из предыдущих лет, которые применяются только к aws php sdk v1 или v2, и мне не повезло попробовать их (v3 совсем другой)

какие предложения? Я чувствую, что мне не хватает чего-то простого, но, просматривая документацию, я не могу найди что-нибудь, что поможет мне. В крайнем случае, мне просто придется придерживаться ручного объявления массива

$categories = ['portraits/', 'landscapes/']

но это не идеально в том случае, когда я хочу добавить больше категорий в будущем, и не нужно беспокоиться о добавлении другой категории вручную.

любая помощь будет высоко оценили :)

Изменить - Решение

Я, должно быть, искал в неправильных местах во время моих дампов объектов, но в конечном итоге увидел Общие префиксы в возвращаемом результате вызова ListObjects с разделителем'/', например:

$s3->listObjects(array('Bucket' => $bucket, 'Delimiter' => '/'));

1 ответов


каталоги фактически не существуют в Amazon S3. Однако консоль управления позволяет создавать папки, а пути поддерживаются, чтобы создать иллюзию каталогов.

например, object bar.jpg хранящиеся в foo каталог имеет путь /foo/bar.jpg. Фокус в том, что объект на самом деле называется foo/bar.jpg а не просто bar.jpg. Большинство пользователей даже не заметят разницы.

из API, возможность перечисления каталогов предоставляется через понятие CommonPrefixes, которые выглядят так же, как пути к каталогу и состоят из части имен объектов ("ключи") перед окончательной косой чертой.

посмотреть: перечисление ключей иерархически с использованием префикса и разделителя