2012-05-07 4 views
2

J'ai besoin de HTTP PUT un fichier csv et certains champs POST en utilisant POST multipart avec PHP et Curl à un point de terminaison API REST.Chargement en plusieurs parties PUT en utilisant Curl et PHP à un point de terminaison REST

Le contenu du téléchargement de fichier est stocké dans une liste $ variable. L'autre point final est $ url. Le code ci-dessus semble fonctionner le seul problème est que l'autre point final nécessite un nom de champ spécifique pour le téléchargement du fichier. Comment puis-je définir un nom de fichier?

Est-ce que je fais quelque chose de mal?

C'est le format PUT ils ont mentionné sur l'API

Content-Disposition: form-data; name="list[csv]"; filename="RackMultipart20110923-63966-hfpyg" 
Content-Length: 33 
Content-Type: text/csv 
Content-Transfer-Encoding: binary 

xxxx 
yyyy 
zzzz 
-------------MultipartPost 
Content-Disposition: form-data; name="list[list_type]" 

Blacklist 
-------------MultipartPost-- 
+1

Vous savez que PUT est la mauvaise méthode pour les données en plusieurs parties? Les requêtes PUT sont censées se rapporter directement au contenu d'un fichier sur le serveur et cela n'a pas vraiment de sens de mettre en PUT des requêtes en plusieurs parties - êtes-vous sûr que vous ne devriez pas le POSTER à la place? Il semble que POSTing ['multipart/form-data'] (http://en.wikipedia.org/wiki/MIME#Form_Data) aurait beaucoup plus de sens ici ... Le fichier serait spécifié avec un' Content-Disposition : attachement; name = "nom du champ"; filename = "nom de fichier" 'header – DaveRandom

+0

1. Le point de terminaison REST nécessite un PUT. 2. Le téléchargement de fichier en utilisant POST me demandera de spécifier un nom de fichier dans le tableau POST et je dois le télécharger à partir d'une variable. Probablement une solution intermédiaire pourrait être de créer un fichier temporaire à partir de la variable et le télécharger, mais je ne veux pas le faire. –

+0

Quel est le type MIME du contenu que vous envoyez? Pouvez-vous nous montrer des documents d'API pour le point de terminaison? Je ne comprends pas comment on pourrait spécifier un nom de fichier sans utiliser une forme de type 'multipart/*', auquel cas c'est l'en-tête 'Content-Disposition' dont vous avez besoin - vous pourriez avoir besoin de construire le corps du message. – DaveRandom

Répondre

5

Pour votre information, qui est multipart/form-data. Vous aurez besoin de construire le corps vous-même, je pense, je ne pense pas que cURL pourrait être fait pour construire ce genre de demande avec une demande PUT. Cependant, ce n'est pas un problème sérieux:

<?php 

    function recursive_array_mpfd ($array, $separator, &$output, $prefix = '') { 
    // Recurses through a multidimensional array and populates $output with a 
    // multipart/form-data string representing the data 
    foreach ($array as $key => $val) { 
     $name = ($prefix) ? $prefix."[".$key."]" : $key; 
     if (is_array($val)) { 
     recursive_array_mpfd($val, $separator, $output, $name); 
     } else { 
     $output .= "--$separator\r\n" 
       . "Content-Disposition: form-data; name=\"$name\"\r\n" 
       . "\r\n" 
       . "$val\r\n"; 
     } 
    } 
    } 

    // This will hold the request body string 
    $requestBody = ''; 

    // We'll need a separator 
    $separator = '-----'.md5(microtime()).'-----'; 

    // First add the postfields 
    $post = array(
    //Other Post fields array 
); 
    recursive_array_mpfd($post, $separator, $requestBody); 

    // Now add the file 
    $list = "this,is,some,csv,data"; // The content of the file 
    $filename = "data.csv"; // The name of the file 
    $requestBody .= "--$separator\r\n" 
       . "Content-Disposition: form-data; name=\"list[list_type]\"; filename=\"$filename\"\r\n" 
       . "Content-Length: ".strlen($list)."\r\n" 
       . "Content-Type: text/csv\r\n" 
       . "Content-Transfer-Encoding: binary\r\n" 
       . "\r\n" 
       . "$list\r\n"; 

    // Terminate the body 
    $requestBody .= "--$separator--"; 

    // Let's go cURLing... 
    $ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_PUT, true); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $requestBody); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: multipart/form-data; boundary="'.$separator.'"' 
)); 
    $response = curl_exec($ch); 

Si vous avez des problèmes avec cela, essayez echo $requestBody; avant la demande cURL et assurez-vous qu'il vous ressemble attendez.

+0

+ Bonne réponse ..... – Baba

Questions connexes