it-swarm.com.de

Verwenden von Curl zum Hochladen von POST Daten mit Dateien

Ich möchte mit cURL nicht nur Datenparameter in HTTP POST senden, sondern auch Dateien mit einem bestimmten Formularnamen hochladen. Wie soll ich das machen?

HTTP-Post-Parameter:

userid = 12345 filecomment = Dies ist eine Bilddatei

HTTP-Datei-Upload: Dateispeicherort = /home/user1/Desktop/test.jpg Formularname für file = image (entspricht $ _FILES ['image'] auf der Seite PHP)

Ich habe einen Teil des Befehls cURL folgendermaßen berechnet:

curl -d "userid=1&filecomment=This is an image file" --data-binary @"/home/user1/Desktop/test.jpg" localhost/uploader.php

Das Problem, das ich bekomme, ist wie folgt:

Notice: Undefined index: image in /var/www/uploader.php

Das Problem ist, dass ich $ _FILES ['image'] verwende, um Dateien im PHP -Skript aufzunehmen.

Wie passe ich meine cURL-Befehle entsprechend an?

373
thotheolh

Sie müssen die Option -F verwenden:
-F/--form <name=content> Specify HTTP multipart POST data (H)

Versuche dies:

curl \
  -F "userid=1" \
  -F "filecomment=This is an image file" \
  -F "[email protected]/home/user1/Desktop/test.jpg" \
  localhost/uploader.php
596
jimp

Abrufen der Benutzer-ID als Pfadvariable (empfohlen):

curl -i -X POST -H "Content-Type: multipart/form-data" 
-F "[email protected]" http://mysuperserver/media/1234/upload/

Abrufen der Benutzer-ID als Teil des Formulars:

curl -i -X POST -H "Content-Type: multipart/form-data" 
-F "[email protected];userid=1234" http://mysuperserver/media/upload/

oder:

curl -i -X POST -H "Content-Type: multipart/form-data" 
-F "[email protected]" -F "userid=1234" http://mysuperserver/media/upload/
80
r1ckr

Hier ist meine Lösung, ich habe viele Beiträge gelesen und sie waren wirklich hilfreich. Schließlich habe ich Code für kleine Dateien mit cURL und PHP geschrieben, der meiner Meinung nach wirklich nützlich ist.

public function postFile()
{    
        $file_url = "test.txt";  //here is the file route, in this case is on same directory but you can set URL too like "http://examplewebsite.com/test.txt"
        $eol = "\r\n"; //default line-break for mime type
        $BOUNDARY = md5(time()); //random boundaryid, is a separator for each param on my post curl function
        $BODY=""; //init my curl body
        $BODY.= '--'.$BOUNDARY. $eol; //start param header
        $BODY .= 'Content-Disposition: form-data; name="sometext"' . $eol . $eol; // last Content with 2 $eol, in this case is only 1 content.
        $BODY .= "Some Data" . $eol;//param data in this case is a simple post data and 1 $eol for the end of the data
        $BODY.= '--'.$BOUNDARY. $eol; // start 2nd param,
        $BODY.= 'Content-Disposition: form-data; name="somefile"; filename="test.txt"'. $eol ; //first Content data for post file, remember you only put 1 when you are going to add more Contents, and 2 on the last, to close the Content Instance
        $BODY.= 'Content-Type: application/octet-stream' . $eol; //Same before row
        $BODY.= 'Content-Transfer-Encoding: base64' . $eol . $eol; // we put the last Content and 2 $eol,
        $BODY.= chunk_split(base64_encode(file_get_contents($file_url))) . $eol; // we write the Base64 File Content and the $eol to finish the data,
        $BODY.= '--'.$BOUNDARY .'--' . $eol. $eol; // we close the param and the post width "--" and 2 $eol at the end of our boundary header.



        $ch = curl_init(); //init curl
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                         'X_PARAM_TOKEN : 71e2cb8b-42b7-4bf0-b2e8-53fbd2f578f9' //custom header for my api validation you can get it from $_SERVER["HTTP_X_PARAM_TOKEN"] variable
                         ,"Content-Type: multipart/form-data; boundary=".$BOUNDARY) //setting our mime type for make it work on $_FILE variable
                    );
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/1.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0'); //setting our user agent
        curl_setopt($ch, CURLOPT_URL, "api.endpoint.post"); //setting our api post url
        curl_setopt($ch, CURLOPT_COOKIEJAR, $BOUNDARY.'.txt'); //saving cookies just in case we want
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); // call return content
        curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); navigate the endpoint
        curl_setopt($ch, CURLOPT_POST, true); //set as post
        curl_setopt($ch, CURLOPT_POSTFIELDS, $BODY); // set our $BODY 


        $response = curl_exec($ch); // start curl navigation

     print_r($response); //print response

}

Damit sollten wir auf der "api.endpoint.post" folgende vars gepostet bekommen. Sie können mit diesem Skript leicht testen, und Sie sollten diese Debugs für die Funktion postFile() in der letzten Zeile erhalten.

print_r($response); //print response

public function getPostFile()
{

    echo "\n\n_SERVER\n";
    echo "<pre>";
    print_r($_SERVER['HTTP_X_PARAM_TOKEN']);
    echo "/<pre>";
    echo "_POST\n";
    echo "<pre>";
    print_r($_POST['sometext']);
    echo "/<pre>";
    echo "_FILES\n";
    echo "<pre>";
    print_r($_FILEST['somefile']);
    echo "/<pre>";
}

Es sollte gut funktionieren, sie sind möglicherweise bessere Lösungen, aber dies funktioniert und ist sehr hilfreich, um zu verstehen, wie die Boundary- und Multipart-/From-Data-Mime-Funktion für PHP und die cURL-Bibliothek funktioniert.

22
Libertese

wenn Sie eine Binärdatei wie csv hochladen, verwenden Sie das folgende Format, um die Datei hochzuladen

curl -X POST \
    'http://localhost:8080/workers' \
    -H 'authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6ImFjY2VzcyIsInR5cGUiOiJhY2Nlc3MifQ.eyJ1c2VySWQiOjEsImFjY291bnRJZCI6MSwiaWF0IjoxNTExMzMwMzg5LCJleHAiOjE1MTM5MjIzODksImF1ZCI6Imh0dHBzOi8veW91cmRvbWFpbi5jb20iLCJpc3MiOiJmZWF0aGVycyIsInN1YiI6ImFub255bW91cyJ9.HWk7qJ0uK6SEi8qSeeB6-TGslDlZOTpG51U6kVi8nYc' \
    -H 'content-type: application/x-www-form-urlencoded' \
    --data-binary '@/home/limitless/Downloads/iRoute Masters - Workers.csv'
6
KARTHIKEYAN.A

Alternativ zu curl können Sie HTTPie verwenden, ein CLI-CURL-ähnliches Tool für Menschen.

  1. Installationsanleitung: https://github.com/jakubroztocil/httpie#installation

  2. Dann renne:

    http -f POST http://localhost:4040/api/users username=johnsnow [email protected]/avatar.jpg
    
    HTTP/1.1 200 OK
    Access-Control-Expose-Headers: X-Frontend
    Cache-control: no-store
    Connection: keep-alive
    Content-Encoding: gzip
    Content-Length: 89
    Content-Type: text/html; charset=windows-1251
    Date: Tue, 26 Jun 2018 11:11:55 GMT
    Pragma: no-cache
    Server: Apache
    Vary: Accept-Encoding
    X-Frontend: front623311
    
    ...
    
1
Gianfranco P.

So umgehen Sie beliebige Dateinamen hochgeladener Dateien korrekt mit bash:

#!/bin/bash
set -eu

f="$1"
f=${f//\\/\\\\}
f=${f//\"/\\\"}
f=${f//;/\\;}

curl --silent --form "[email protected]\"$f\"" "$2"
1