Enviar solicitud POST con datos especificados en el archivo a través de Curl

242

Necesito hacer una solicitud POST a través de Curl desde la línea de comandos. Los datos para esta solicitud se encuentran en un archivo. Sé que a través de PUT esto se podría hacer con la --upload-fileopción.

curl host:port/post-file -H "Content-Type: text/xml" --data "contents_of_file"
sueco
fuente
Comprueba mi respuesta, stackoverflow.com/questions/6213509/send-json-post-using-php/…
Muhammad Zeeshan
1
Lo siento, tal vez describí mi problema por error, necesito enviar la solicitud no a través de php-curl sino solo a través del comando curl desde la línea de comandos de linux os.
sueco

Respuestas:

365

Estás buscando el --data-binaryargumento:

curl -i -X POST host:port/post-file \
  -H "Content-Type: text/xml" \
  --data-binary "@path/to/file"

En el ejemplo anterior, -iimprime todos los encabezados para que pueda ver lo que está sucediendo y -X POSThace explícito que esta es una publicación. Ambos pueden omitirse de manera segura sin cambiar el comportamiento en el cable. La ruta al archivo debe ir precedida de un @símbolo, por lo que curldebe leer desde un archivo.

Richard J
fuente
@ ɢʜʘʂʈʀɛɔʘɴ en este caso sería.xml
dennismonsewicz
54
¡La @parte es extremadamente importante!
Ron Klein
Entonces usamos el parámetro --data-binary, pero ¿el contenido real del archivo puede ser texto? Dado que XML no es típicamente binario.
David
8
en realidad se puede usar solo -d flag
Anatoly Yakimchuk
16
@ Tol182 -dhará curlque se eliminen las nuevas líneas, pero --data-binaryno lo hará.
Acumenus
45

Necesito hacer una solicitud POST a través de Curl desde la línea de comandos. Los datos para esta solicitud se encuentran en un archivo ...

Todo lo que necesita hacer es que el --dataargumento comience con un @:

curl -H "Content-Type: text/xml" --data "@path_of_file" host:port/post-file-path

Por ejemplo, si tiene los datos en un archivo llamado, stuff.xmlentonces haría algo como:

curl -H "Content-Type: text/xml" --data "@stuff.xml" host:port/post-file-path

El stuff.xmlnombre del archivo puede ser reemplazado con una ruta relativa o completa al archivo: @../xml/stuff.xml, @/var/tmp/stuff.xml, ...

gris
fuente
2
En caso de que necesite enviar un campo con nombre, también puede usarlo --data "name@stuff".
Hermann
15

Si está utilizando datos de formulario para cargar archivos, en los que se debe especificar un nombre de parámetro, puede usar:

curl -X POST -i -F "parametername=@filename" -F "additional_parm=param2" host:port/xxx

Lucas Liu
fuente
¡Gracias! La 1. solución no funcionó para mí. parametername=realmente me ayudó :)
Cyborg
3

La mayoría de las respuestas son perfectas aquí, pero cuando llegué aquí por mi problema particular, tengo que cargar un archivo binario (hoja de cálculo XLSX) usando el método POST, veo que falta algo , es decir, generalmente no es solo el archivo que carga, puede que tenga más elementos de datos de formulario , como comentario a archivo o etiquetas a archivo, etc., como fue mi caso. Por lo tanto, me gustaría agregarlo aquí, ya que era mi caso de uso, para que pueda ayudar a otros.

curl -POST -F comment=mycomment -F file_type=XLSX -F file_data=@/your/path/to/file.XLSX http://yourhost.example.com/api/example_url
Chico rojo
fuente