2012-09-14 6 views
1

J'essaie de créer un compartiment sur le stockage google cloud en utilisant PHP et REST. Je peux très bien créer le seau dans la région des États-Unis, mais je n'arrive pas à en créer un dans la région de l'UE.Comment créer un compartiment dans la région UE?

Voici ce que je fais -

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; 
} 

Cette fonction fonctionne très bien pour un seau américain, mais échoue en cas de l'UE. Je m'assure que le nom généré pour le seau est un nom unique (le même modèle fonctionne pour les seaux US).

éditer: En fait, la fonction n'échoue pas, elle crée un bucket ... elle crée simplement le bucket dans la région US, en dépit de la spécification de la région EU.

Répondre

1

Comment dites-vous si cela a réussi? gsutil -L? J'ai simplement utilisé gsutil pour spécifier un emplacement et jeté le contenu de la requête avec -DD et j'ai remarqué que le document XML envoyé dans le corps de la requête n'incluait pas d'en-tête XML. Ensuite, j'ai essayé d'utiliser curl pour formuler la requête REST avec un document XML similaire sans entête et cela a bien fonctionné pour moi. Ensuite, j'ai essayé boucle à nouveau avec l'en-tête XML et il a échoué avec cette erreur:

The XML you provided was not well-formed or did not validate against our published schema.

Pouvez-vous retenter votre code PHP sans l'en-tête XML et voir si cela aide? Si c'est le cas, je peux déposer un bug pour cela.

+0

Bonjour Marc, Oui J'utilise gsutil pour tester la création d'un compartiment. En fait, je compris que ma demande REST avait une teneur en longueur de 0 et je changé à: 'strlen (XML_PAYLOAD)' et j'ai reçu l'erreur exacte que vous voyez: 'MalformedBucketConfiguration' ' Le Le code XML que vous avez fourni n'était pas bien formé ou n'a pas été validé par rapport à notre schéma publié. » –

+0

Doit également mentionner que j'ai reçu l'erreur pour les régions américaines et européennes –

+1

Votre XML semble manquer le point d'interrogation d'ouverture' ...' (c'est le cas [dans le doco] (https://developers.google.com/storage/docs/developer- guide # specifyinglocations) –

Questions connexes