Utilizzo di arricciatura per caricare i dati POST con i file

Vorrei utilizzare cURL non solo per inviare parametri di dati nel POST HTTP, ma anche per caricare file con un nome di modulo specifico. Come dovrei fare per farlo?

Parametri HTTP Post:

userid = 12345 filecomment = Questo è un file immagine

Caricamento file HTTP: percorso file = /home/user1/Desktop/test.jpg Nome modulo per file = immagine (corrisponde al $ _FILES [‘immagine’] sul lato PHP)

Ho capito parte del comando cURL come segue:

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

Il problema che sto ottenendo è il seguente:

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

Il problema è che sto usando $ _FILES [‘image’] per raccogliere i file nello script PHP.

Come aggiusto i miei comandi cURL di conseguenza?

Devi usare l’opzione -F :
-F/--form Specify HTTP multipart POST data (H)

Prova questo:

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

Cattura l’id utente come variabile di percorso (consigliato):

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

Cattura l’ID utente come parte del modulo:

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

o:

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

Ecco la mia soluzione, ho letto molti post e sono stati davvero utili. Alla fine ho scritto del codice per i file di piccole dimensioni, con cURL e PHP che penso sia davvero utile.

 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 } 

Con questo dovremmo essere sul “api.endpoint.post” i seguenti annunci pubblicati. Puoi facilmente testare con questo script, e dovresti ricevere questi debug sulla funzione postFile() nell’ultima riga.

 print_r($response); //print response public function getPostFile() { echo "\n\n_SERVER\n"; echo "
"; print_r($_SERVER['HTTP_X_PARAM_TOKEN']); echo "/
"; echo "_POST\n"; echo "
"; print_r($_POST['sometext']); echo "/
"; echo "_FILES\n"; echo "
"; print_r($_FILEST['somefile']); echo "/
"; }

Dovrebbe funzionare bene, potrebbero essere soluzioni migliori ma questo funziona ed è davvero utile per capire come il mimo Boundary e multipart / from-data funzioni su PHP e la libreria cURL.

se stai caricando file binari come csv, usa il formato sotto per caricare il file

 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' 

Ecco come eseguire correttamente l’escape dei nomi di file arbitrari dei file caricati con bash :

 #!/bin/bash set -eu f="$1" f=${f//\\/\\\\} f=${f//\"/\\\"} f=${f//;/\\;} curl --silent --form "[email protected]\"$f\"" "$2" 

Come alternativa al curl , puoi usare HTTPie , è uno strumento CLI, simile a CURL per gli umani.

  1. Istruzioni per l’installazione: https://github.com/jakubroztocil/httpie#installation

  2. Quindi, esegui:

     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 ...