我正在使用Rackspace CloudFiles API,在该cludfiles API中,我需要检查容器内是否存在文件夹。
我已经在不同的区域进行了搜索,我可以找到解决方案以查找是否存在容器或物体。
例如:
格式:容器/文件夹/subfolder/file
实际文件存储的位置: test/test_folder/test_subfolder/test.txt
我想知道我的容器已经有一个名为 test_folder
的文件夹我遇到了一些说路径的东西,但是不确定我们是否存在这种方法!
getObjects ->> 'path', 'file path to search'
我在PHP或Guzzle的背景下无法真正回答这个问题,但是我可以在云文件和一些命令行curl示例上提供一些可能会有所帮助的信息。
rackspace云文件实际上没有容器内"文件夹"的概念。您有一个带有以下作品的URL: https://{storege_endpoint}/{account_name}/{container_name}/{object_name}
>但是,您可以通过使用名称中的"/"字符创建对象来模拟文件夹。然后,在执行容器列表时,您可以设置"前缀"one_answers"定界符"查询字符串参数以模仿类似文件夹的行为。
例如,假设您对容器的列表列出以查看所有对象:
$ 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"one_answers" 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。
如果您现在想测试" subfolter"内部" foo",则可以执行另一个容器列表,将前缀更改为" foo/bar/",并保留"/".pin.
此外,如果要创建一个文件夹" 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)
希望这会有所帮助。