2010-09-11 7 views
0

Je dois effectuer un appel HTTP POST vers un serveur Hudson CI à partir de CakePHP. L'appel est paramétré et contient quelques paires clé/valeur. Certains d'entre eux sont en fait des fichiers qui doivent être téléchargés.Envoyer un fichier via une requête POST avec http_socket dans CakePHP?

Depuis que j'utilise CakePHP, je préfère utiliser la classe HttpSocket qui vient avec le framework plutôt que d'essayer d'écrire ma propre implémentation basée sur cURL.

Jusqu'à présent, l'appel ressemble à ceci:

$result = $http->post($apiCall, $params, $auth);

$ apicall étant l'URI de l'API REST Hudson. $ params étant un tableau de paramètres associé à l'appel POST. $ auth contenant un utilisateur/pass pour Basic Auth qui est configuré avec cette instance de Hudson.

Je suis un peu perplexe cependant: que devrais-je faire pour inclure aussi les fichiers dans mon tableau $ params?

Nous utilisons Hudson v1.371 qui, pour autant que je sache, supporte les téléchargements de fichiers provenant d'un appel de construction paramétré.

Merci!

+0

Je suis sur le même bateau. Je ne pense pas que la classe HTTPSocket puisse le faire nativement. La meilleure solution semble créer manuellement les données de contenu en plusieurs parties. – pixelastic

Répondre

1

Je ne sais pas si la classe HttpSocket gère les demandes Http en plusieurs parties. Mais vous pouvez le créer manuellement. Je l'ai fait dans mon CakePHP GData Plugin qui inclut des fonctionnalités pour télécharger des vidéos sur YouTube. La méthode save dans le YouTubeVideo model crée une demande multipart Http avec la première partie contenant un document XML avec des données méta sur la vidéo et la seconde partie est le contenu binaire du fichier vidéo en cours de téléchargement:

// The boundary string is used to identify the different parts of a 
// multipart http request 
$boundaryString = 'Next_Part_' . String::uuid(); 

// Build the multipart body of the http request 
$body = "--$boundaryString\r\n"; 
$body.= "Content-Type: application/atom+xml; charset=UTF-8\r\n"; 
$body.= "\r\n"; 
$body.= $doc->saveXML()."\r\n"; 
$body.= "--$boundaryString\r\n"; 
$body.= "Content-Type: {$data[$this->alias]['file']['type']}\r\n"; 
$body.= "Content-Transfer-Encoding: binary\r\n"; 
$body.= "\r\n"; 
$body.= file_get_contents($data[$this->alias]['file']['tmp_name'])."\r\n"; 
$body.= "--$boundaryString--\r\n"; 

$this->request = array(
    'method' => 'POST', 
    'uri' => array(
    'host' => 'uploads.gdata.youtube.com', 
    'path' => '/feeds/api/users/default/uploads', 
), 
    'header' => array(
    'Content-Type' => 'multipart/related; boundary="' . $boundaryString . '"', 
    'Slug' => $data[$this->alias]['file']['name'] 
), 
    'auth' => array(
    'method' => 'OAuth', 
), 
    'body' => $body, 
); 

Cela pourrait se vous y.

1

J'ai essayé d'utiliser la syntaxe typique $result = $HttpSocket->post($url,$data,$request); et cela fonctionne pour moi. Btw, il y a quelques exemples que httpsocket envoie des données vierges (que je n'ai pas encore résolues) donc j'ai utilisé cURL pour cela.

De même, assurez-vous que vous utilisez un formulaire en plusieurs parties pour votre formulaire. :)