Ferramenta de linha de comando do Linux para fazer upload de arquivos via HTTP como dados de várias partes / formulário?

25

Eu posso ver que o wget tem uma --post-fileopção, mas a página de manual diz

O Wget atualmente não suporta dados de várias partes / formulário para transmitir dados POST; somente application / x-www-form-urlencoded. Apenas um --post-datae --post-filedeve ser especificado.

Existe uma maneira semelhante de fazer upload de arquivos em dados de várias partes / formulário?

kdt
fonte

Respostas:

31

Use curl:

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

É 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:

  1. 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.
  2. Cada atributo BOUNDARY nos dados posteriores deve corresponder ao valor BOUNDARY na chamada para wget. (FILEUPLOAD no exemplo)
  3. Todos os limites são prefixados com dois hífens "-" e terminados com \ r \ n
  4. O último limite é sufixado com dois hífens extras "-" e finalizado com \ r \ n
  5. 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.

restabelecer Monica-dor duh
fonte
Não consegui que o wget trabalhasse com um arquivo binário. Criei a parte de texto do arquivo de dados de postagem, salvei, usei cat pic.jpg >> postdata, carreguei no Notepad ++ e anexei o último limite + '-' + EOL. Referência W3C
Chloe
@Chloe, eu tive que revisar isso para outro projeto, e dessa vez arquivos binários foram necessários e achei que funcionavam conforme o esperado. Eu construí uma página de upload de arquivo php simples e, em seguida, fiz isso através de um navegador para obter o tamanho do arquivo e compará-lo ao resultado do uso do wget. Sugiro que você faça o mesmo, pois uma nova linha perdida pode causar a falha de todo o processo.
tu restabelece Monica-dor duh
1
Falta um ponto e vírgula. Causou problemas com o tornado do python --header = "Tipo de conteúdo: multipart / form-data; boundary = FILEUPLOAD"
FlappySocks