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í:
- 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.
- Cada atributo BOUNDARY en los datos posteriores debe coincidir con el valor BOUNDARY en la llamada a wget. (FILEUPLOAD en el ejemplo)
- Todos los límites tienen como prefijo dos guiones "-" y terminan con \ r \ n
- El último límite tiene el sufijo de dos guiones adicionales "-" y termina con \ r \ n
- 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.
cat pic.jpg >> postdata
, cargué en Notepad ++ y agregué el último límite + '-' + EOL. Referencia del W3C