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

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

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

Например:

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

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

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

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

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

2 ответа

Решение

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

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

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

Другие вопросы по тегам