Posten von Rohbilddaten als Multipart/Form-Daten in Curl

Lesezeit: 5 Minuten

Posten von Rohbilddaten als MultipartForm Daten in Curl
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.

Ich verwende dieses Formular auf Client-Seite:

<form action="http://myServerURL" method="POST" enctype="multipart/form-data">
    <input type="file" name="file" />
    <input type="Submit">
</form>

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:

curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);

var_dump(curl_getinfo($ch));

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…

Jede Hilfe geschätzt, danke

  • ü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

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.

$fields = [
    'name' => new \CurlFile($filePath, 'image/png', 'filename.png')
];
curl_setopt($resource, CURLOPT_POSTFIELDS, $fields);

  • 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

Posten von Rohbilddaten als MultipartForm Daten in Curl
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:

if (isset($_POST['btnUpload']))
{
$url = "URL_PATH of upload.php"; // e.g. http://localhost/myuploader/upload.php // request URL
$filename = $_FILES['file']['name'];
$filedata = $_FILES['file']['tmp_name'];
$filesize = $_FILES['file']['size'];
if ($filedata != '')
{
    $headers = array("Content-Type:multipart/form-data"); // cURL headers for file uploading
    $postfields = array("filedata" => "@$filedata", "filename" => $filename);
    $ch = curl_init();
    $options = array(
        CURLOPT_URL => $url,
        CURLOPT_HEADER => true,
        CURLOPT_POST => 1,
        CURLOPT_HTTPHEADER => $headers,
        CURLOPT_POSTFIELDS => $postfields,
        CURLOPT_INFILESIZE => $filesize,
        CURLOPT_RETURNTRANSFER => true
    ); // cURL options
    curl_setopt_array($ch, $options);
    curl_exec($ch);
    if(!curl_errno($ch))
    {
        $info = curl_getinfo($ch);
        if ($info['http_code'] == 200)
            $errmsg = "File uploaded successfully";
    }
    else
    {
        $errmsg = curl_error($ch);
    }
    curl_close($ch);
}
else
{
    $errmsg = "Please select the file";
}
}

HTML-Formular sollte in etwa so aussehen:

<form action="uploadpost.php" method="post" name="frmUpload" enctype="multipart/form-data">
<tr>
  <td>Upload</td>
  <td align="center">:</td>
  <td><input name="file" type="file" id="file"/></td>
</tr>
<tr>
  <td>&nbsp;</td>
  <td align="center">&nbsp;</td>
  <td><input name="btnUpload" type="submit" value="Upload" /></td>
</tr>

  • 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


Posten von Rohbilddaten als MultipartForm Daten in Curl
Schirjeel Ahmed Khan

CURL-VORGANG ZWISCHEN SERVER ZU SERVER OHNE HTML-FORMULAR IN PHP MIT MULTIPART/FORM-DATEN

// hochzuladende Dateien

$filename = "https://example.s3.amazonaws.com/0.jpg";       

// URL zum Hochladen (Zielserver)

$url = "https://otherserver/image";

UND

    $curl = curl_init();

    curl_setopt_array($curl, array(
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        //CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_POST => 1,
        CURLOPT_POSTFIELDS => file_get_contents($filename),
        CURLOPT_HTTPHEADER => array(
            //"Authorization: Bearer $TOKEN",
            "Content-Type: multipart/form-data",
            "Content-Length: " . strlen(file_get_contents($filename)),
            "API-Key: abcdefghi" //Optional if required
        ),
    ));

   $response = curl_exec($curl);

    $info = curl_getinfo($curl);
//echo "code: ${info['http_code']}";

//print_r($info['request_header']);

    var_dump($response);
    $err = curl_error($curl);

    echo "error";
    var_dump($err);
    curl_close($curl);

  • funktioniert fast.. Ich erhalte in Zeile 0 in Unbekannt eine fehlende Grenze in den POST-Daten von multipart/form-data

    – Danny Coulombe

    18. Juni 2020 um 14:13 Uhr

929790cookie-checkPosten von Rohbilddaten als Multipart/Form-Daten in Curl

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy