在多次试验之后,我不得不得出这样一个一个结论,那就是BAE的bcs不支持操作文件夹。为什么这么说呢,因为所有试图将文件夹作为对象操作的代码都会无情地得到一个error “”,比如:
$response = $baidu_bcs->delete_object($bucket, "/data/");
被error:
Body:{"Error":{"code":"2","Message":"object not exists","LogId":"901523708"}}
哪怕你的data目录下空空如也,bcs也不允许你删除它。在bcs的设计理念中,object的概念很模糊。到底什么是对象呢?文件肯定是的,那么文件夹是不是呢?我尝试用list_object_by_dir来列出根目录下的所有对象,发现/data/确实是一个对象,只不过它的is_dir属性为1,而文件的这个属性为0:
{
"object_total":2,
"bucket":"hankcstest",
"start":0,
"limit":200,
"parent_dir":"%2F",
"object_list":[
{
"version_key":"CA38A99734E885ED5D845F413480AC4F",
"object":"/1.txt",
"superfile":"0",
"size":"3886",
"parent_dir":"/",
"is_dir":"0",
"mdatetime":"1374052139",
"ref_key":"",
"content_md5":"23DA3983CB890A6C486D834F1964F9BC"
},
{
"version_key":"",
"object":"/data/",
"superfile":"0",
"size":"0",
"parent_dir":"/",
"is_dir":"1",
"mdatetime":"1374051432",
"ref_key":"",
"content_md5":""
}
]
}
但是,如果你试图通过delete_object来删除/data/,bcs又会告诉你这个对象不存在,真是让人迷惑。让我们从头开始再现这一悖论吧:
echo "Welcome to Baidu Cloud
";
require_once './bcs.class.php';
$baidu_bcs = new BaiduBCS ();
echo "BCS created
";
$bucket = 'hankcstest';
$object = "/data/index.php";
$file = "index.php";
$response = $baidu_bcs->create_object($bucket, $object, $file);
echo "create file $object : ";
echo $response->isOK () ? "OK
" : "NOT OK
";
echo 'Status:' . $response->status . "
";
echo 'Body:' . $response->body . "
";
foreach ( $response->header as $key => $value ) {
echo "Http Header -> $key:$value
";
}
$object = "/";
$response = $baidu_bcs->list_object_by_dir($bucket, $object);
echo "list folder $object : ";
echo $response->isOK () ? "OK
" : "NOT OK
";
echo 'Status:' . $response->status . "
";
echo 'Body:' . $response->body . "
";
foreach ( $response->header as $key => $value ) {
echo "Http Header -> $key:$value
";
}
$object = "/data/index.php";
$response = $baidu_bcs->delete_object($bucket, $object);
echo "delete file $object : ";
echo $response->isOK () ? "OK
" : "NOT OK
";
echo 'Status:' . $response->status . "
";
echo 'Body:' . $response->body . "
";
foreach ( $response->header as $key => $value ) {
echo "Http Header -> $key:$value
";
}
$object = "/data/";
$response = $baidu_bcs->list_object_by_dir($bucket, $object);
echo "list folder $object : ";
echo $response->isOK () ? "OK
" : "NOT OK
";
echo 'Status:' . $response->status . "
";
echo 'Body:' . $response->body . "
";
foreach ( $response->header as $key => $value ) {
echo "Http Header -> $key:$value
";
}
$object = "/data/";
$response = $baidu_bcs->delete_object($bucket, $object);
echo "delete folder $object : ";
echo $response->isOK () ? "OK
" : "NOT OK
";
echo 'Status:' . $response->status . "
";
echo 'Body:' . $response->body . "
";
foreach ( $response->header as $key => $value ) {
echo "Http Header -> $key:$value
";
}
?>
我依次创建了bcs对象,上传了index.php到/data/index.php然后list了一下根目录下对象,发现了一个对象也就是我们的/data/,然后我删掉了/data/index.php,此时/data/就是空的了,然后我试图删掉/data/,失败,对象不存在,完整的输出:
Welcome to Baidu Cloud
BCS created
create file /data/index.php : OK
Status:200
Body:
Http Header -> Server:nginx/1.2.0
Http Header -> Date:Wed, 17 Jul 2013 09:16:50 GMT
Http Header -> Content-Length:0
Http Header -> Connection:keep-alive
Http Header -> Access-Control-Allow-Origin:*
Http Header -> Access-Control-Allow-Methods:GET,PUT,POST,DELETE,OPTIONS,HEAD
Http Header -> x-bs-version:BA45FE1D2198269804DCC07F015996F4
Http Header -> ETag:64b217bb1f3aa429f3226d9c2edb37f4
Http Header -> Content-MD5:64b217bb1f3aa429f3226d9c2edb37f4
Http Header -> x-bs-request-id:MTAuMzYuMTAwLjE2OjgwODA6MTEzNDYyOTgwOToxNy9KdWwvMjAxMyAxNzoxNjo1MCA=
Http Header -> x-bs-file-size:1107
Http Header -> x-bs-client-ip:MjIwLjE4MS41MS4xNDI=
Http Header -> _info:Array
list folder / : OK
Status:200
Body:{"object_total":1,"bucket":"hankcstest","start":0,"limit":200,"parent_dir":"%2F","object_list":[{"version_key":"","object":"\/data\/","superfile":"0","size":"0","parent_dir":"\/","is_dir":"1","mdatetime":"1374051432","ref_key":"","content_md5":""}]}
Http Header -> Server:nginx/1.2.0
Http Header -> Date:Wed, 17 Jul 2013 09:16:50 GMT
Http Header -> Content-Type:application/json
Http Header -> Transfer-Encoding:chunked
Http Header -> Connection:keep-alive
Http Header -> Access-Control-Allow-Origin:*
Http Header -> Access-Control-Allow-Methods:GET,PUT,POST,DELETE,OPTIONS,HEAD
Http Header -> x-bs-request-id:Y3EwMS1iYWUtb2ZmdWkwLTkuY3EwMS5iYWlkdS5jb206ODA6Mzc1NzQ2MzM5NTU=
Http Header -> x-bs-client-ip:MjIwLjE4MS41MS4xMzk=
Http Header -> _info:Array
delete file /data/index.php : OK
Status:200
Body:
Http Header -> Server:nginx/1.2.0
Http Header -> Date:Wed, 17 Jul 2013 09:16:50 GMT
Http Header -> Content-Length:0
Http Header -> Connection:keep-alive
Http Header -> Access-Control-Allow-Origin:*
Http Header -> Access-Control-Allow-Methods:GET,PUT,POST,DELETE,OPTIONS,HEAD
Http Header -> x-bs-client-ip:MjIwLjE4MS41MS4xNDE=
Http Header -> _info:Array
list folder /data/ : OK
Status:200
Body:{"object_total":0,"bucket":"hankcstest","start":0,"limit":200,"parent_dir":"%2Fdata%2F","object_list":[]}
Http Header -> Server:nginx/1.2.0
Http Header -> Date:Wed, 17 Jul 2013 09:16:50 GMT
Http Header -> Content-Type:application/json
Http Header -> Transfer-Encoding:chunked
Http Header -> Connection:keep-alive
Http Header -> Access-Control-Allow-Origin:*
Http Header -> Access-Control-Allow-Methods:GET,PUT,POST,DELETE,OPTIONS,HEAD
Http Header -> x-bs-request-id:bTEtYmFlLW9mZnVpMC03Lm0xLmJhaWR1LmNvbTo4MDozODE0NTM2MDgxMQ==
Http Header -> x-bs-client-ip:MjIwLjE4MS41MS4xNDk=
Http Header -> _info:Array
delete folder /data/ : NOT OK
Status:404
Body:{"Error":{"code":"2","Message":"object not exists","LogId":"2443104357"}}
Http Header -> Server:nginx/1.2.0
Http Header -> Date:Wed, 17 Jul 2013 09:16:50 GMT
Http Header -> Content-Type:application/json
Http Header -> Content-Length:73
Http Header -> Connection:keep-alive
Http Header -> Access-Control-Allow-Origin:*
Http Header -> Access-Control-Allow-Methods:GET,PUT,POST,DELETE,OPTIONS,HEAD
Http Header -> x-bs-request-id:MTAuMzYuMTM1LjM2OjgwODA6MjQ0MzEwNDM1NzoxNy9KdWwvMjAxMyAxNzoxNjo1MCA=
Http Header -> _info:Array
你可能会觉得奇怪,既然文件夹删不掉,那么delete_bucket不就也失去了存在的意义吗?一个永远清空不料的bucket如何删得掉?BAE怪人有怪招,使用一句delete_object($bucket, "/")之后整个bucket就消失了,你说怪不怪?
我在想这是不是BAE的设计失误,希望某一天BAE能够重新设计它的bcs libs。