Я пишу PHP-скрипт для загрузки папок, если он не найден в корзине Amazon S3 с использованием s3cmd. Для этого сначала мне нужно получить все имена папок и сохранить их в массиве, а затем проверить массив с помощью array_search, если имя папки есть или нет, и перейти к следующему шагу.
Я использовал get_object_list и list_objects в PHP, оба не будут возвращать только имена папок. Интересно, есть ли способ сделать это?
Amazon S3 использует это «плоская» система хранения. На самом деле он не поддерживает папки / подкаталоги. Скорее, путь к подкаталогу хранится как часть имени файла, известного как «ключ».
Например, foo.txt
хранится в папке с именем bar
на самом деле создает объект с ключевым именем bar/foo.txt
, При получении объекта он выглядит так, как будто он находится в каталоге bar, но на самом деле это не так.
S3 поддерживает возможность получения списка Общие префиксы фактически это список каталогов, но нет никакой гарантии, что такие префиксы всегда существуют, особенно для пустых каталогов.
Вместо того чтобы писать скрипт для «загрузки папок, если они не найдены», взгляните на Интерфейс командной строки AWS (CLI). Включает в себя команду aws s3 sync
который может автоматически копировать файлы между локациями, включая копирование только новых или измененных файлов. Это может полностью исключить необходимость написания собственного сценария.
Amazon S3 — это облачное хранилище / объектное хранилище с плоским пространством имен. На Amazon S3 нет концепции папки или каталога. То, что у вас есть, это key
И его CommonPrefixes
Чтобы получить подобное ощущение POSIX, нужно использовать ListObjects () со специальными разделителями, чтобы обеспечить эмуляцию просмотра файловой системы.
https://github.com/minio/mc построен с такой целью, что вы хотите, довольно легко сделать в mc
,
Вот пример подхода к тому, как вы можете увидеть, как это работает. mc
Особенности индикатор выполнения, управление сессиями, дружественный к сценариям --json
выходной и многое другое.
$ mc --json ls https://s3.amazonaws.com/miniocloud | jq 'if .type == "folder" then .name else empty end'
"G/""Go/""asdfasdfadsf/""bin/""ema/""emacs/""new/""te1231231231231231231231/""test/"