Posten von Rohbilddaten als Multipart/Form-Daten in Curl
Lesezeit: 5 Minuten
Zugoase
Ich versuche, ein Bild mit cURL in PHP mit multipart/form-data Header zu posten, da die API, an die ich sende, erwartet, dass das Bild als mehrteiliges Formular gesendet wird.
Ich habe keine Probleme, mit anderen Anfragen mit der API zu kommunizieren; Nur das Posten eines Bildes ist ein Problem.
und dies ist der Server, auf dem ich poste (hier versuche ich, diese Daten an eine API weiterzuleiten):
$ch = curl_init($url);
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $imgRawData); // <-- raw data here hm?
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookieJar);
curl_setopt( $ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLINFO_HEADER_OUT, 1); <-- using this as I wanted to check if HTTPHEADER is set
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data')); <-- setting content-type header?
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1);
// i get response from the server
$response = curl_exec( $ch );
// with this I can check what kind of content type the last request had?
$requestContentType = curl_getinfo($ch,CURLINFO_CONTENT_TYPE);
echo "<br>request Content Type was:".$requestContentType."<br>";
curl_close($ch);
echo "<br><b>SERVER POST IMAGE RESPONSE:</b><br>";
echo $response;
Mit dem folgenden Code kann ich meine Anfrageheader sehen:
Der Inhaltstyp in Request-Headern wird jetzt korrekt angezeigt. Aber es scheint, dass das Bild nicht korrekt gesendet wird, wie es die API erwarten würde. Leider habe ich keinen Zugriff auf die API…
Dies funktionierte nach einigen geringfügigen Änderungen in Bezug auf meine Struktur usw. Sie können als Antwort posten, wenn Sie möchten …
– Zugoase
20. Februar 2014 um 12:03 Uhr
ist ok, wenn es bei dir geklappt hat 🙂
– PravinS
20. Februar 2014 um 12:19 Uhr
Ab PHP 5.6 @$filePath wird nicht funktionieren CURLOPT_POSTFIELDS ohne CURLOPT_SAFE_UPLOAD gesetzt und wird in PHP 7 vollständig entfernt. Sie müssen a verwenden CurlDatei Objekt, RFC hier.
Das war wirklich nützlich für mich und führte mich dazu, @ in meinem Projekt nicht mehr zu verwenden und stattdessen CurlFile zu verwenden. Danke!
– David Refoua
30. Juli 2016 um 22:38 Uhr
Zugoase
Falls jemand das gleiche Problem hatte: Check Das wie @PravinS vorgeschlagen. Ich habe genau den gleichen Code wie dort gezeigt und es hat perfekt für mich funktioniert.
Dies ist der relevante Teil des Servercodes, der geholfen hat:
Welcher Teil des Codes löste also das Problem, das Sie hatten? Das Posten des relevanten Code-Snippets hilft anderen, die auf das gleiche Problem stoßen. (Vor allem, wenn dieser Link unterbrochen oder geändert wird)
– Leigh
22. Februar 2014 um 17:28 Uhr
Warum verwenden die Leute die CURLFile-Funktion nicht? Ich versuche es, aber es funktioniert nicht, noch finde ich funktionierende Code-Snippets mit seiner Verwendung. Haben Sie die CURLFile-Klasse absichtlich komplett ignoriert?
– Erich
10. Dezember 2014 um 19:56 Uhr
@Erik die CURLFile-Klasse ist verfügbar für >= PHP 5.5. Da (neben anderen Systemen) der aktuelle Debian-Stall (zu diesem Zeitpunkt wheezy) PHP 5.4 standardmäßig verwendet, können sie die CURLFile-Klasse nicht verwenden.
– MukMuk
10. März 2015 um 10:52 Uhr
Schirjeel Ahmed Khan
CURL-VORGANG ZWISCHEN SERVER ZU SERVER OHNE HTML-FORMULAR IN PHP MIT MULTIPART/FORM-DATEN
überprüfen Sie diese URL: php-guru.in/2013/upload-files-using-php-curl
– PravinS
20. Februar 2014 um 11:33 Uhr
Dies funktionierte nach einigen geringfügigen Änderungen in Bezug auf meine Struktur usw. Sie können als Antwort posten, wenn Sie möchten …
– Zugoase
20. Februar 2014 um 12:03 Uhr
ist ok, wenn es bei dir geklappt hat 🙂
– PravinS
20. Februar 2014 um 12:19 Uhr