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

21

Eu posso ver que wget tem uma opção --post-file, mas a página de manual diz "Wget não suporta atualmente dados multipart / form para transmissão de dados POST; somente application / x-www-form-urlencoded. Apenas um de '--post-data' e '--post-file' devem ser especificados. "

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

    
por kdt 21.12.2009 / 12:41

2 respostas

28

Use o curl:

curl -F "file=@localfile;filename=nameinpost" url.com
    
por 21.12.2009 / 12:46
14

É possível fazer isso apenas com o wget. Pelo menos com a versão 1.13.4 e talvez com outras. A opção --post-file permite que você especifique um arquivo para enviar, desde que o arquivo postdata seja construído adequadamente.

Eu também testei isso com arquivos binários e funciona como esperado. Você NÃO precisa codificar com base64 o arquivo, 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 dados dentro do contexto do arquivo.
  2. Todo atributo BOUNDARY no postdata 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 pedaço de dados, conteúdo de arquivo ou valor de parâmetro é cercado por uma linha vazia "\ r \ n"

Eu achei que isso poderia ajudar alguém, já que alguns ambientes controlados se tornaram indesejados, mas não se curvam.

    
por 03.10.2012 / 04:28