Rackspace CloudFiles API проверяет, существует ли путь к файлу?

Я работаю с Rackspace CloudFiles API, где у меня есть требование проверить, существует ли папка внутри контейнера.

Я искал в разных областях, я мог бы найти решение, чтобы найти, существует ли контейнер или объект.

Например:

Формат: контейнер / папки / подпапки / файл

Фактическое местоположение файла:
test/test_folder/test_subfolder/test.txt

Я хочу знать, что мой контейнер уже получил папку с именем test_folder

И я наткнулся на то, что говорит путь, но я не уверен, что у нас этот метод существует!

getObjects ->> 'path', 'file path to search'

1

Решение

Я не могу действительно ответить на этот вопрос в контексте 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/

1

Другие решения

Хотя ответ @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)

Надеюсь, это поможет.

1

По вопросам рекламы [email protected]