1

我正在尝试使用 PHP 和 REST 在谷歌云存储上创建一个存储桶。我可以在美国地区很好地创建存储桶,但似乎无法在欧盟地区创建存储桶。

这就是我正在做的 -

function createBucket($accessToken, $bucket, $region)
{
    $version_header = "x-goog-api-version: 2";
    $project_header = "x-goog-project-id: ".$this->projectID;
    $url = 'https://'.$bucket.'.commondatastorage.googleapis.com';
    $timestamp = date("r");
    define('XML_PAYLOAD','<xml version=\'1.0\' ? ><CreateBucketConfiguration><LocationConstraint>'.$region.'</LocationConstraint></CreateBucketConfiguration>');

    $headers = array(
                'Host: '.$bucket.'.commondatastorage.googleapis.com',
                'Date: '.$timestamp, 
                $version_header,
                $project_header, 
                'Content-Length: 0',
                'Authorization: OAuth '.$accessToken);

    $c   = curl_init($url);
    curl_setopt($c, CURLOPT_HEADER, 1);
    curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($c, CURLOPT_HTTPHEADER,$headers);
    curl_setopt($c, CURLOPT_POSTFIELDS,XML_PAYLOAD);
    curl_setopt($c, CURLOPT_CUSTOMREQUEST, "PUT");
    $response = curl_exec($c);
    curl_close($c);

    // split up the response into header and xml body
    list($header, $xml) = explode("\r\n\r\n", $response, 2);
    // tokenize - first token is the status
    $status = strtok($header, "\r\n"); 

    if(stristr($status,"200 OK"))
    {
        //success
        $result = "success";
    }
    else
    {
        //failed
        $result = "fail";
    }

    return $result;
}

此功能适用于美国桶,但在欧盟的情况下失败。我确保为存储桶生成的名称是唯一名称(相同的模式适用于美国存储桶)。

编辑:实际上该功能没有失败,它确实创建了一个存储桶......尽管指定了欧盟地区,但它只是在美国地区创建了存储桶。

4

1 回答 1

1

你怎么判断它是否成功?gsutil -L?

我只是使用 gsutil 指定位置并使用 -DD 转储请求的内容,并注意到在请求正文中发送的 XML 文档不包含 XML 标头。接下来,我尝试使用 curl 使用类似的无标题 XML 文档来制定 REST 请求,它对我来说效果很好。接下来,我再次尝试使用 XML 标头 curl 并失败并出现以下错误:

您提供的 XML 格式不正确或未针对我们发布的架构进行验证。

您可以在没有 XML 标头的情况下重试您的 PHP 代码,看看是否有帮助?如果是这样,我可以为此提交一个错误。

于 2012-09-14T01:07:20.677 回答