PHP - Rackspace CloudFiles API检查文件路径是否已存在?

时间:2016-11-30 14:21:30

标签: php guzzle rackspace-cloud rackspace rackspace-cloudfiles

我正在使用Rackspace CloudFiles API,我需要检查容器内是否存在文件夹。

我搜索了不同的区域,我可以找到解决方案来查找容器是否存在或对象是否存在。

例如:

格式:容器/文件夹/子文件夹/文件

实际文件存储位置 test/test_folder/test_subfolder/test.txt

我想知道我的容器已经有一个名为 test_folder 的文件夹

我遇到了一些说路径的东西,但我不确定这种方法是否存在!

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

2 个答案:

答案 0 :(得分:1)

我无法在PHP或Guzzle的上下文中回答这个问题,但我可以提供一些有关Cloud Files和一些可能有帮助的命令行卷曲示例的信息。

Rackspace Cloud Files实际上并没有"文件夹"的概念。内部容器。您有一个包含以下内容的网址:    HTTPS:// {storage_endpoint} / {ACCOUNT_NAME} / {CONTAINER_NAME} / {OBJECT_NAME}

然而,您可以通过使用" /"创建对象来模拟文件夹。名字中的字符。然后在执行容器列表时,您可以设置"前缀"和"分隔符"查询字符串参数以模拟类似文件夹的行为。

例如,假设您列出了容器列表以查看所有对象:

$ 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和Pseudo-Hierarchical文件夹的更多信息: https://developer.rackspace.com/docs/cloud-files/v1/general-api-info/pseudo-hierarchical-folders-and-directories/

答案 1 :(得分: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)

希望这会有所帮助。