2017-10-14 8 views
0

J'essaie d'envoyer un fichier via http POST en utilisant PHP et curl.multipart/form-data Téléchargement de fichiers csv POST PHP curl

Je n'ai eu aucun problème à travailler avec les champs de base, mais depuis que j'ai essayé de télécharger le fichier, je n'ai toujours pas de chance.

A partir du terminal, je peux facilement l'obtenir pour travailler avec la commande suivante:

curl --header 'Content-Type: multipart/form-data' --header 'auth-token: #.######.##.##########################' -F '[email protected]_csv.csv' -F 'command=import' -F 'parameters={"contact-list_code": "1", "separator": ",", "header": false, "file_columns": [{"Position":"0", "Field":"1", "Rule":"3"}, {"Position":"1", "Field":"14", "Rule":"3"} ] }' http://api.com/method 

J'ai essayé d'utiliser les éléments suivants en php:

$file = '@'.realpath(dirname(__FILE__) . '/exports/test_csv.csv'); 
$data = http_build_query(array(
    "command" => "import", 
    "file" => $file, 
    "parameters" => array(
     "contact-list_code" => "1", 
     "separator" => ",", 
     "header" => false, 
     "file_columns" => array(
      array(
       "Position" => "0", 
       "Field" => "1", 
       "Rule" => "3" 
      ), 
      array(
       "Position" => "1", 
       "Field" => "14", 
       "Rule" => "3" 
      ) 
     ) 
    ) 
)); 
$authToken = '#.######.##.##########################'; 

$serviceHandler = curl_init(); 
curl_setopt($serviceHandler, CURLOPT_URL, 'http://api.com/method'); 
$headers = array(); 
$headers[] = "Content-Type: multipart/form-data"; 
$headers[] = "Auth-Token: ".$authToken; 

curl_setopt($serviceHandler, CURLOPT_RETURNTRANSFER, TRUE); 
curl_setopt($serviceHandler, CURLOPT_POST, TRUE); 
curl_setopt($serviceHandler, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($serviceHandler, CURLOPT_POSTFIELDS, $data); 
curl_setopt($serviceHandler, CURLOPT_HTTPHEADER, $headers); 

print_r(json_decode(curl_exec($serviceHandler))); 

est ici l'erreur reçue: Error handling data from http request

J'ai également essayé d'utiliser la classe CURLFile pour le fichier au lieu du @ pour le fichier, mais il m'a donné le même er ror.

Je pense qu'il vaut la peine de mentionner que je cours ce code dans un plugin Wordpress.

Je me demande ce qui ne va pas avec mon code php puisque la commande curl shell est correcte.

Merci.

Répondre

0

Ne pas utiliser http_build_query lors de la construction $data variables

De la documentation:

CURLOPT_POSTFIELDS

Les données complètes pour publier dans une opération de HTTP "POST". Pour publier un fichier, préfixez un nom de fichier avec @ et utilisez le chemin d'accès complet. Le type de fichier peut être explicitement spécifié en suivant le nom du fichier avec le type au format '; type = type_mime'. Ce paramètre peut être transmis en tant que chaîne codée en url, telle que 'para1 = val1 & para2 = val2 & ...' ou en tant que tableau avec le nom du champ comme valeur de clé et de champ en tant que valeur. Si la valeur est un tableau, l'en-tête Content-Type sera défini sur multipart/form-data. Depuis PHP 5.2.0, la valeur doit être un tableau si les fichiers sont passés à cette option avec le préfixe @. Depuis PHP 5.5.0, le préfixe @ est obsolète et les fichiers peuvent être envoyés en utilisant CURLFile. Le préfixe @ peut être désactivé pour le transfert sécurisé des valeurs commençant par @ en définissant l'option CURLOPT_SAFE_UPLOAD sur TRUE.

+0

Merci pour la réponse! Cependant, il semble que je doive utiliser http_build_query ou json_encode parce que quand j'essaye sans cela, je reçois une erreur disant que le format n'est pas valide. –

+1

Quelle réponse obtenez-vous lorsque vous l'exécutez à partir du terminal? – miknik

+0

Lorsque je l'exécute à partir du terminal, il fonctionne comme il se doit, le fichier est téléchargé et c'est tout, un message de réussite. Le problème est dans mon code php quelque part. –