2017-10-14 1 views
0

Ich versuche, eine Datei über http POST mit PHP und curl zu senden.multipart/form-Daten csv Datei-Upload POST PHP curl

Ich hatte keine Probleme mit grundlegenden Feldern zu arbeiten, aber seit ich versucht habe, die Datei hochzuladen, habe ich immer noch kein Glück.

Vom Terminal ich leicht mit dem folgenden Befehl an der Arbeit kann:

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 

ich folgend in PHP versucht, mit:

$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))); 

Hier ist der Fehler, den ich erhielt: Error handling data from http request

Ich habe auch versucht, CURLFile Klasse für die Datei anstelle der @ für die Datei, aber es gab mir die gleiche er ror.

Ich denke, es ist erwähnenswert, dass ich diesen Code in einem Wordpress-Plugin ausführen.

Ich frage mich, was falsch mit meinem PHP-Code ist seit der Curl-Shell-Befehl in Ordnung ist.

Vielen Dank.

Antwort

0

Dont http_build_query verwenden, wenn $data Variable

Aus der Dokumentation der Konstruktion:

CURLOPT_POSTFIELDS

Die vollständigen Daten in einem HTTP "POST" Betrieb zu stellen. Um eine Datei zu veröffentlichen, fügen Sie einen Dateinamen mit @ voran und verwenden Sie den vollständigen Pfad. Der Dateityp kann explizit angegeben werden, indem der Dateiname mit dem Typ im Format '; type = mimetype' angegeben wird. Dieser Parameter kann entweder als urlencodierte Zeichenfolge wie 'para1 = val1 & para2 = val2 & ...' oder als Array mit dem Feldnamen als Schlüssel- und Felddaten als Wert übergeben werden. Wenn value ein Array ist, wird der Content-Type-Header auf multipart/form-data gesetzt. Ab PHP 5.2.0 muss value ein Array sein, wenn Dateien mit dem Präfix @ an diese Option übergeben werden. Ab PHP 5.5.0 ist das Präfix @ veraltet und Dateien können mit CURLFile gesendet werden. Das Präfix @ kann für die sichere Übergabe von Werten, die mit @ beginnen, deaktiviert werden, indem die Option CURLOPT_SAFE_UPLOAD auf TRUE gesetzt wird.

+0

Vielen Dank für die Antwort! Wie auch immer ich scheint, muss ich http_build_query oder json_encode verwenden, denn wenn ich es ohne es versuche, erhalte ich eine Fehlermeldung, dass das Format ungültig ist. –

+1

Welche Antwort erhalten Sie, wenn Sie es vom Terminal aus starten? – miknik

+0

Wenn ich es vom Terminal aus starte, funktioniert es einfach wie es sollte, die Datei wird hochgeladen und das war's, eine Erfolgsmeldung. Das Problem ist irgendwo in meinem PHP-Code. –