form files shell file curl post file-upload

shell - files - Usando curl para cargar datos POST con archivos



curl--upload-file (6)

Aquí es cómo escapar correctamente los nombres de archivo arbitrarios de los archivos cargados con bash :

#!/bin/bash set -eu f="$1" f=${f/////////} f=${f///"////"} f=${f//;///;} curl --silent --form "uploaded=@/"$f/"" "$2"

Me gustaría usar cURL no solo para enviar parámetros de datos en HTTP POST sino también para cargar archivos con un nombre de formulario específico. ¿Cómo debo hacer para hacer eso?

Parámetros HTTP Post:

userid = 12345 filecomment = Este es un archivo de imagen

Carga del archivo HTTP: ubicación del archivo = /home/user1/Desktop/test.jpg Nombre de formulario para archivo = imagen (corresponde a $ _FILES [''imagen''] en el lado de PHP)

Calculé parte del comando cURL de la siguiente manera:

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

El problema que estoy teniendo es el siguiente:

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

El problema es que estoy usando $ _FILES [''imagen''] para recoger archivos en el script PHP.

¿Cómo puedo ajustar mis comandos cURL en consecuencia?


Aquí está mi solución, he estado leyendo muchas publicaciones y fueron muy útiles. Finalmente escribí un código para archivos pequeños, con cURL y PHP que creo que es realmente útil.

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 esto deberíamos estar en la "api.endpoint.post" las siguientes vars publicadas. Puede probar fácilmente con este script, y debería recibir estos debugs en la función postFile() en la última fila.

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>"; }

Debería funcionar bien, pueden ser mejores soluciones, pero esto funciona y es realmente útil para entender cómo funcionan los límites y el mimo multiparte / de datos en la biblioteca PHP y cURL.


Captura del ID de usuario como variable de ruta (recomendado):

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

Capturando el ID de usuario como parte del formulario:

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/


Como alternativa al curl , puede usar HTTPie , es una herramienta CLI, similar a cURL para los humanos.

  1. Instrucciones de instalación: https://github.com/jakubroztocil/httpie#installation

  2. Entonces corre:

    http -f POST http://localhost:4040/api/users username=johnsnow photo@images/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 ...


Necesitas usar la opción -F :
-F/--form <name=content> Specify HTTP multipart POST data (H)

Prueba esto:

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


Si está cargando un archivo binario como csv, use el siguiente formato para cargar un archivo

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