É possível fazer isso apenas com o wget. Pelo menos com a versão 1.13.4 e talvez outras. A opção --post-file permite que você especifique um arquivo a ser enviado, desde que o arquivo postdata seja construído corretamente.
Também testei isso com arquivos binários e funciona conforme o esperado. Você NÃO precisa codificar o arquivo base64, mas precisa garantir que seu arquivo não contenha o limite.
O comando mínimo necessário para fazer este trabalho seria:
wget --header="Content-type: multipart/form-data boundary=FILEUPLOAD" --post-file postfile http://domain/uploadform
e o arquivo postdata precisaria conter 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--
Vários detalhes são importantes aqui:
- As linhas no arquivo de dados de postagem são finalizadas com \ r \ n. A única exceção são os dados dentro do contexto do arquivo.
- Cada atributo BOUNDARY nos dados posteriores deve corresponder ao valor BOUNDARY na chamada para wget. (FILEUPLOAD no exemplo)
- Todos os limites são prefixados com dois hífens "-" e terminados com \ r \ n
- O último limite é sufixado com dois hífens extras "-" e finalizado com \ r \ n
- Cada dado, conteúdo do arquivo ou valor do parâmetro, é cercado por uma linha vazia "\ r \ n"
Eu pensei que isso poderia ajudar alguém, já que alguns ambientes controlados têm wget, mas não enrolam.
cat pic.jpg >> postdata
, carreguei no Notepad ++ e anexei o último limite + '-' + EOL. Referência W3C