shell form Usando curl para cargar datos POST con archivos




send file post php (5)

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 "[email protected]/home/user1/Desktop/test.jpg" \
  localhost/uploader.php

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?


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

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'

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 "[email protected]\"$f\"" "$2"






file-upload