¿Herramienta de línea de comandos de Linux para cargar archivos a través de HTTP como datos multiparte / formulario?

25

Puedo ver que wget tiene una --post-fileopción, pero la página de manual dice

Actualmente, Wget no admite datos multiparte / formulario para transmitir datos POST; solo application / x-www-form-urlencoded. Solo uno de --post-datay --post-filedebe especificarse.

¿Existe una forma similar de cargar archivos en multiparte / datos de formulario?

kdt
fuente

Respuestas:

31

Usar rizo:

curl -F "file=@localfile;filename=nameinpost" url.com
Tobu
fuente
17

Es posible hacer esto solo con wget. Al menos con la versión 1.13.4 y tal vez otras. La opción --post-file le permite especificar un archivo para enviar, siempre que el archivo de datos posteriores se construya correctamente.

También he probado esto con archivos binarios y funciona como se esperaba. NO necesita codificar en base64 el archivo, pero debe asegurarse de que su archivo no contenga el límite.

El comando mínimo requerido para hacer que esto funcione sería:

wget --header="Content-type: multipart/form-data boundary=FILEUPLOAD" --post-file postfile http://domain/uploadform

y el archivo postdata debería contener algo como:

--FILEUPLOAD
Content-Disposition: form-data; name="comment"

I love uploading files!

--FILEUPLOAD
Content-Disposition: form-data; name="uploadFile"; filename="myfile.bin"; 
Content-Type: application/octet-stream
Media Type: application/octet-stream

Give me some automated file upload action!

--FILEUPLOAD--

Una serie de detalles son importantes aquí:

  1. Las líneas en el archivo de datos de publicación terminan con \ r \ n. La única excepción son los datos dentro del contexto del archivo.
  2. Cada atributo BOUNDARY en los datos posteriores debe coincidir con el valor BOUNDARY en la llamada a wget. (FILEUPLOAD en el ejemplo)
  3. Todos los límites tienen como prefijo dos guiones "-" y terminan con \ r \ n
  4. El último límite tiene el sufijo de dos guiones adicionales "-" y termina con \ r \ n
  5. Cada dato, contenido de archivo o valor de parámetro, está rodeado por una línea vacía "\ r \ n"

Pensé que esto podría ayudar a alguien ya que algunos entornos controlados tienen wget pero no rizos.

tu-Reinstate Monica-dor duh
fuente
No pude hacer que wget funcione con un archivo binario. Creé la parte de texto del archivo de datos de publicación, guardé, usé cat pic.jpg >> postdata, cargué en Notepad ++ y agregué el último límite + '-' + EOL. Referencia del W3C
Chloe
@Chloe, tuve que revisar esto para otro proyecto, y esta vez se necesitaban archivos binarios y descubrí que funcionaba como se esperaba. Construí una página simple de carga de archivos php y luego lo hice a través de un navegador para obtener primero el tamaño del archivo y luego lo comparé con el resultado del uso de wget. Te sugiero que hagas lo mismo ya que una nueva línea perdida puede hacer que todo el proceso falle.
tu-Reinstate Monica-dor duh
1
Falta un punto y coma. Causó problemas con el tornado de Python --header = "Content-type: multipart / form-data; boundary = FILEUPLOAD"
FlappySocks el