在多次试验之后,我不得不得出这样一个一个结论,那就是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又会告诉你这个对象不存在,真是让人迷惑。让我们从头开始再现这一悖论吧:
<?php echo "Welcome to Baidu Cloud<br>"; require_once './bcs.class.php'; $baidu_bcs = new BaiduBCS (); echo "BCS created<br>"; $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<br>" : "NOT OK<br>"; echo 'Status:' . $response->status . "<br>"; echo 'Body:' . $response->body . "<br>"; foreach ( $response->header as $key => $value ) { echo "Http Header -> $key:$value<br>"; } $object = "/"; $response = $baidu_bcs->list_object_by_dir($bucket, $object); echo "list folder $object : "; echo $response->isOK () ? "OK<br>" : "NOT OK<br>"; echo 'Status:' . $response->status . "<br>"; echo 'Body:' . $response->body . "<br>"; foreach ( $response->header as $key => $value ) { echo "Http Header -> $key:$value<br>"; } $object = "/data/index.php"; $response = $baidu_bcs->delete_object($bucket, $object); echo "delete file $object : "; echo $response->isOK () ? "OK<br>" : "NOT OK<br>"; echo 'Status:' . $response->status . "<br>"; echo 'Body:' . $response->body . "<br>"; foreach ( $response->header as $key => $value ) { echo "Http Header -> $key:$value<br>"; } $object = "/data/"; $response = $baidu_bcs->list_object_by_dir($bucket, $object); echo "list folder $object : "; echo $response->isOK () ? "OK<br>" : "NOT OK<br>"; echo 'Status:' . $response->status . "<br>"; echo 'Body:' . $response->body . "<br>"; foreach ( $response->header as $key => $value ) { echo "Http Header -> $key:$value<br>"; } $object = "/data/"; $response = $baidu_bcs->delete_object($bucket, $object); echo "delete folder $object : "; echo $response->isOK () ? "OK<br>" : "NOT OK<br>"; echo 'Status:' . $response->status . "<br>"; echo 'Body:' . $response->body . "<br>"; foreach ( $response->header as $key => $value ) { echo "Http Header -> $key:$value<br>"; } ?>
我依次创建了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。
把"/data/"换成"/data",不知道可不可以删掉。。。
bcs.class.php中的146-148行、278-286行
应该不行的吧,假如根目录下有一个文件名叫data,那么delete_object($bucket, "/data")到底是删文件还是删目录呢?
嗯,这个是我没想全面。。。
这个可以在版本管理,设置里面开通……
你指的是NFS吧?我说的是bcs……