PHP - Rackspace CloudFiles API 检查文件路径是否已经存在?
PHP - Rackspace CloudFiles API check if the file path already exists?
我正在使用 Rackspace CloudFiles API,我需要检查容器中是否存在文件夹。
我搜索了不同的区域,我可以找到解决方案来确定容器是否存在或对象是否存在。
例如:
格式: container/folder/subfolder/file
实际文件存放位置:
test/test_folder/test_subfolder/test.txt
我想知道我的容器是否已经有一个名为 test_folder
的文件夹
我遇到了一些说路径的东西,但我不确定我们是否存在这种方法!
getObjects ->> 'path', 'file path to search'
我无法在 PHP 或 Guzzle 的上下文中真正回答这个问题,但我可以提供一些关于 Cloud Files 的信息和一些可能有帮助的命令行 curl 示例。
Rackspace Cloud Files 在容器内部并没有真正的 "folders" 概念。您有一个包含以下部分的 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 以及与该前缀匹配的对象列表。如果不存在具有该前缀的对象,则 "folder" 不存在并且将返回 HTTP 204。
如果您现在想在 "foo" 中测试 "sub-folder",您可以执行另一个容器列表,将前缀更改为 "foo/bar/" 并保留分隔符“/”。
此外,如果你想创建一个文件夹"images"并让它包含"cat.jpg",你不需要先创建一个文件夹,你只需要创建一个名为[=48=的对象] 包含 cat.jpg.
的数据
您可以在此处找到有关 Rackspace 云文件和伪分层文件夹的更多信息:
https://developer.rackspace.com/docs/cloud-files/v1/general-api-info/pseudo-hierarchical-folders-and-directories/
尽管@hurricanerix 的回答对我有帮助,但我想 post 确切的 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)
希望这会有所帮助。
我正在使用 Rackspace CloudFiles API,我需要检查容器中是否存在文件夹。
我搜索了不同的区域,我可以找到解决方案来确定容器是否存在或对象是否存在。
例如:
格式: container/folder/subfolder/file
实际文件存放位置:
test/test_folder/test_subfolder/test.txt
我想知道我的容器是否已经有一个名为 test_folder
的文件夹我遇到了一些说路径的东西,但我不确定我们是否存在这种方法!
getObjects ->> 'path', 'file path to search'
我无法在 PHP 或 Guzzle 的上下文中真正回答这个问题,但我可以提供一些关于 Cloud Files 的信息和一些可能有帮助的命令行 curl 示例。
Rackspace Cloud Files 在容器内部并没有真正的 "folders" 概念。您有一个包含以下部分的 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 以及与该前缀匹配的对象列表。如果不存在具有该前缀的对象,则 "folder" 不存在并且将返回 HTTP 204。
如果您现在想在 "foo" 中测试 "sub-folder",您可以执行另一个容器列表,将前缀更改为 "foo/bar/" 并保留分隔符“/”。
此外,如果你想创建一个文件夹"images"并让它包含"cat.jpg",你不需要先创建一个文件夹,你只需要创建一个名为[=48=的对象] 包含 cat.jpg.
的数据您可以在此处找到有关 Rackspace 云文件和伪分层文件夹的更多信息: https://developer.rackspace.com/docs/cloud-files/v1/general-api-info/pseudo-hierarchical-folders-and-directories/
尽管@hurricanerix 的回答对我有帮助,但我想 post 确切的 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)
希望这会有所帮助。