Без какого-либо видимого шаблона многие папки отсутствуют в списке найденных папок.
Вот ваша проблема: вы предполагаете, что всегда должны быть объекты склавиши, оканчивающиеся на /
для обозначения папок.
Это неверное предположение.Они будут там только в том случае, если вы их создали, либо через консоль S3, либо через API.Нет никаких оснований ожидать их, поскольку S3 на самом деле не нуждается в них и не использует их ни для чего, а служба S3 сама не создает их самопроизвольно.
Если вы используете API для загрузки объекта с ключомfoo/bar.txt
, это не создает папку foo/
как отдельный объект.Для удобства он будет отображаться как папка на консоли, но его там нет, если только в какой-то момент вы его не умышленно создали.
Конечно, единственный способ загрузить такой объект с консоли - это "создать "папку, если она уже не появляется - но появляется в консоли не обязательно соответствует существует как отдельный объект.
Фильтрация на endsWith("/")
isневерная логика.
Именно поэтому базовый API включает CommonPrefixes
в каждый ответ ListObjects, если указаны delimiter
и prefix
.Это список следующего уровня «папок», в который вы должны рекурсивно углубиться, чтобы найти следующий уровень.
Если вы укажете префикс, все ключи, содержащие одинаковыеСтрока между префиксом и первым появлением разделителя после префикса сгруппирована в один элемент результата, называемый CommonPrefixes.Если вы не укажете параметр префикса, подстрока начинается с начала ключа.Ключи, сгруппированные в элементе результата CommonPrefixes, не возвращаются в другом месте в ответе.
https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html
Вам необходимо получить доступ к этой функции с любой библиотекой, которую вы используете или используете, иливам нужно перебрать весь список ключей и найти фактические общие префиксы на границах /
, используя разбиение строк.