Я работаю с Rackspace CloudFiles API, где у меня есть требование проверить, существует ли папка внутри контейнера.
Я искал в разных областях, я мог бы найти решение, чтобы найти, существует ли контейнер или объект.
Например:
Формат: контейнер / папки / подпапки / файл
Фактическое местоположение файла:
test/test_folder/test_subfolder/test.txt
Я хочу знать, что мой контейнер уже получил папку с именем test_folder
И я наткнулся на то, что говорит путь, но я не уверен, что у нас этот метод существует!
getObjects ->> 'path', 'file path to search'
Я не могу действительно ответить на этот вопрос в контексте PHP или Guzzle, но я могу предоставить некоторую информацию о Cloud Files и некоторые примеры скручивания командной строки, которые могут помочь.
Облачные файлы Rackspace на самом деле не имеют понятия «папки» внутри контейнеров. У вас есть URL со следующими частями:
https: // {storage_endpoint} / {account_name} / {container_name} / {object_name}
Однако вы можете эмулировать папки, создавая объекты с символом «/» в имени. Затем, выполняя листинг контейнера, вы можете установить параметры строки запроса «prefix» и «delimiter», чтобы имитировать поведение, похожее на папку.
Например, скажем, вы делаете список вашего контейнера, чтобы увидеть все ваши объекты:
$ curl -i -XGET -H"x-auth-token: $AUTH_TOKEN" https://storage101.iad3.clouddrive.com/v1/$ACCOUNT_NAME/$CONTAINER_NAME
HTTP/1.1 200 OK
...
Date: Thu, 01 Dec 2016 02:16:53 GMT
foo/file1.txt
foo/bar/file2.txt
baz/file3.txt
baz/file4.txt
Здесь у нас есть четыре объекта с именами «foo / file1.txt», «foo / bar / file2.txt», «baz / file3.txt» и «baz / file4.txt».
Самый простой способ проверить наличие папки «foo» — установить префикс «foo /» и разделитель «/» следующим образом:
$ curl -i -XGET -H"x-auth-token: $AUTH_TOKEN" https://storage101.iad3.clouddrive.com/v1/$ACCOUNT_NAME/$CONTAINER_NAME?prefix=foo/&delimiter=/
HTTP/1.1 200 OK
...
Date: Thu, 01 Dec 2016 02:16:45 GMT
foo/file1.txt
foo/bar/file2.txt
Как вы можете видеть, если какие-либо объекты существуют с этим префиксом, то возвращается HTTP 200 вместе со списком объектов, которые соответствуют префиксу. Если с этим префиксом не существует объектов, «папка» не существует и возвращается HTTP 204.
Если вы теперь хотите проверить «подпапку» внутри «foo», вы можете просто выполнить другой список контейнеров, изменив префикс на «foo / bar /» и сохранив разделитель «/».
Кроме того, если вы хотите создать папку «images» и она содержит «cat.jpg», вам не нужно сначала создавать папку, вы просто создаете объект с именем «images / cat.jpg», который содержит данные для cat.jpg.
Вы можете найти больше информации о Rackspace Cloud Files и псевдо-иерархических папках здесь:
https://developer.rackspace.com/docs/cloud-files/v1/general-api-info/pseudo-hierarchical-folders-and-directories/
Хотя ответ @hurricanerix помог мне, я хочу опубликовать точный метод PHP и фрагмент, чтобы помочь другим в будущем.
$client = new Rackspace(Rackspace::US_IDENTITY_ENDPOINT, array(
'username' => 'XXXXXXXX',
'apiKey' => 'XXXXXXXXXXXXXXXXXXX'
));
$total = 0;
$containerObjects = array();
$objectStoreService = $client->objectStoreService(null, 'XX');
$container = $objectStoreService->getContainer('test');
$objData = $container->ObjectList(array('prefix'=>"test_folder/", 'delimiter'=>"/"));
if(is_object($objData))
{
$total = $objData->count();
if ($total == 0)
break;
foreach ($objData as $object) {
$containerObjects[] = $object->getName();
}
}
var_dump($containerObjects);
Выход
array (size=1)
0 => string 'test/test_folder/test_subfolder/' (length=32)
Надеюсь, это поможет.