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?

Respostas:


31

Use curl:

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

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.