qiniu / php-sdk

Qiniu Resource (Cloud) Storage SDK for PHP
MIT License
809 stars 427 forks source link

批量操作资源时,返回no such bucket错误信息 #247

Closed lliudb closed 6 years ago

lliudb commented 6 years ago

Laravel 5.5 composer.json "qiniu/php-sdk": "^7.2",

$param = BucketManager::buildBatchMove(DEV_BUCKET, $key_pairs, PRODUCT_BUCKET, true);
$auth = new Auth(ACCESS_KEY, SECRET_KEY);
$bucket_Manager = new BucketManager($auth);
list($response, $error) = $bucket_Manager->batch($param);

其中运行时

$url = 'http://rs.qiniu.com/batch';
$body = "op=/move/ZGV2ZWxvcC1yZXNvdXJjZS1jb250ZW50/ZGV2ZWxvcC1yZXNvdXJjZS1jb250ZW50OmRhc2QuanBn/force/true&op=/move/ZGV2ZWxvcC1yZXNvdXJjZS1jb250ZW50OjE=/ZGV2ZWxvcC1yZXNvdXJjZS1jb250ZW50OmRhc2QuanBn/force/true&op=/move/ZGV2ZWxvcC1yZXNvdXJjZS1jb250ZW50/YXBwLXJlc291cmNlLWNvbnRlbnQ6ZGFzZC5qcGc=/force/true"

返回的结果是

response null
error
Response {
  +statusCode: 631
  +headers: array:7 [
    "Server" => "nginx"
    "Date" => "Tue, 31 Oct 2017 09"
    "Content-Type" => "application/json"
    "Content-Length" => "26"
    "Connection" => "keep-alive"
    "X-Log" => "TBLMGR"
    "X-Reqid" => "tmQAAB5lR-Y5n_IU"
  ]
  +body: "{"error":"no such bucket"}"
  +error: "no such bucket"
  -jsonData: array:1 [
    "error" => "no such bucket"
  ]
  +duration: 0.036
}

已确认DEV_BUCKETPRODUCT_BUCKET都是同一个名称,因为没建第二个bucket,用的统一个库,然后ACCESS_KEY,SECRET_KEY也没问题 但是会报这个no such bucket问题,请问是什么原因

ankadada commented 6 years ago

no such bucke状态码631的报错就是指定的空间不存在,把DEV_BUCKET和PRODUCT_BUCKET都打印看看呢,直接用SDK操作会出问题么

lliudb commented 6 years ago

已经看过来,如描述中说,是两个bucket是同一个,也是用这个bucket生成的token上传没问题

ankadada commented 6 years ago

直接写死bucket,用SDK里的demo看看是否正常, op=/move/ZGV2ZWxvcC1yZXNvdXJjZS1jb250ZW50/ZGV2ZWxvcC1yZXNvdXJjZS1jb250ZW50OmRhc2QuanBn/force/true&op=/move/ZGV2ZWxvcC1yZXNvdXJjZS1jb250ZW50OjE=/ZGV2ZWxvcC1yZXNvdXJjZS1jb250ZW50OmRhc2QuanBn/force/true&op=/move/ZGV2ZWxvcC1yZXNvdXJjZS1jb250ZW50/YXBwLXJlc291cmNlLWNvbnRlbnQ6ZGFzZC5qcGc=/force/true

YXBwLXJlc291cmNlLWNvbnRlbnQ6ZGFzZC5qcGc=然后这个解码出来和其他的空间名都不一样 显示的空间名是app-resource-content,其他的解出来是develop-resource-content这个

lliudb commented 6 years ago
$param = BucketManager::buildBatchMove('develop-resource-content', ['img01.jpg', 'img02.jpg'], 'develop-resource-content', true);
$auth = new Auth(ACCESS_KEY, SECRET_KEY);
$bucket_Manager = new BucketManager($auth);
list($response, $error) = $bucket_Manager->batch($param);

写死依然不行,仍然报这个no such bucket错误

ankadada commented 6 years ago

YXBwLXJlc291cmNlLWNvbnRlbnQ6ZGFzZC5qcGc=然后这个解码出来和其他的空间名都不一样 显示的空间名是app-resource-content

image

lliudb commented 6 years ago

这个是我追加的,所以会有这个bucket,但是如上条回复所说,写死后依然会出现这个问题

ankadada commented 6 years ago

app-resource-content这个bucket账号里面有么?之前不是说只有一个空间么?把最后一段这个move到这个app-resource-content空间去除看看是不是正常

lliudb commented 6 years ago

看了下文档,我将

$param = BucketManager::buildBatchMove('develop-resource-content', ['img01.jpg', 'img02.jpg'], 'develop-resource-content', true);

改成

$param = BucketManager::buildBatchMove('develop-resource-content', ['img01.jpg'=> 'img01.jpg', 'img02.jpg'=>'img02.jpg'], 'develop-resource-content', true);

就成功了


问题是,php是包含隐式键的,所以SDK方法 BucketManager::buildBatchMove 不会报错。

    private static function twoKeyBatch($operation, $source_bucket, $key_pairs, $target_bucket, $force)
    {
        if ($target_bucket === null) {
            $target_bucket = $source_bucket;
        }
        $data = array();
        $forceOp = "false";
        if ($force) {
            $forceOp = "true";
        }
        foreach ($key_pairs as $from_key => $to_key) {
            $from = \Qiniu\entry($source_bucket, $from_key);
            $to = \Qiniu\entry($target_bucket, $to_key);
            array_push($data, $operation . '/' . $from . '/' . $to . "/force/" . $forceOp);
        }
        return $data;
    }

可能需要改一下

还有,你们可能需要检查下后台代码,这种情况为啥会返回no such bucket的错误

lliudb commented 6 years ago

还有,批量操作的时候,是否支持同时操作多个bucket到多个bucket的操作

ankadada commented 6 years ago

感谢你的反馈,还有多个bucket之间是可以进行batch操作的

lliudb commented 6 years ago

也谢谢你的解答