Enviar solicitação POST com dados especificados no arquivo via curl

242

Preciso fazer uma solicitação POST via Curl na linha de comando. Os dados para esta solicitação estão localizados em um arquivo. Eu sei que via PUT isso poderia ser feito com a --upload-fileopção

curl host:port/post-file -H "Content-Type: text/xml" --data "contents_of_file"
criador
fonte
Verifique a minha resposta, stackoverflow.com/questions/6213509/send-json-post-using-php/...
Muhammad Zeeshan
1
Desculpe, talvez, por engano, descrevi meu problema, eu preciso enviar o pedido não via php-curl, mas apenas via comando curl na linha de comando do linux os.
breedish

Respostas:

364

Você está procurando o --data-binaryargumento:

curl -i -X POST host:port/post-file \
  -H "Content-Type: text/xml" \
  --data-binary "@path/to/file"

No exemplo acima, -iimprime todos os cabeçalhos para que você possa ver o que está acontecendo e -X POSTtorna explícito que se trata de uma postagem. Ambos podem ser omitidos com segurança sem alterar o comportamento no fio. O caminho para o arquivo precisa ser precedido por um @símbolo, para curlsaber a leitura de um arquivo.

Richard J
fonte
@ ɢʜʘʂʈʀɛɔʘɴ nesse caso, seria #.xml
dennismonsewicz /
54
a @parte é extremamente importante!
21714 Ron
Então usamos o parâmetro --data-binary, mas o conteúdo real do arquivo pode ser texto? Como o XML normalmente não é binário.
David
8
na verdade, você pode usar o sinalizador apenas -d
Anatoly Yakimchuk
16
@ Tol182 -dfará com curlque as novas linhas sejam removidas , mas --data-binarynão o fará.
Acumenus
45

Preciso fazer uma solicitação POST via Curl na linha de comando. Os dados para esta solicitação estão localizados em um arquivo ...

Tudo o que você precisa fazer é --datainiciar o argumento com um @:

curl -H "Content-Type: text/xml" --data "@path_of_file" host:port/post-file-path

Por exemplo, se você tiver os dados em um arquivo chamado stuff.xml, faria algo como:

curl -H "Content-Type: text/xml" --data "@stuff.xml" host:port/post-file-path

O stuff.xmlnome do arquivo pode ser substituído por um caminho relativo ou completo para o arquivo: @../xml/stuff.xml, @/var/tmp/stuff.xml, ...

cinzento
fonte
2
Caso você precise enviar um campo nomeado, você também pode usar --data "name@stuff".
Hermann
15

Se você estiver usando dados do formulário para fazer upload de arquivo, no qual um nome de parâmetro deve ser especificado, você poderá usar:

curl -X POST -i -F "parametername=@filename" -F "additional_parm=param2" host:port/xxx

Lucas Liu
fonte
Obrigado! A solução 1. não funcionou para mim. parametername=realmente me ajudou:) #
229 Cyborg
3

A maioria das respostas é perfeita aqui, mas quando cheguei aqui para o meu problema específico, tenho que fazer upload de arquivo binário (planilha XLSX) usando o método POST, vejo uma coisa faltando , ou seja, geralmente não é apenas o arquivo que você carrega, você pode ter mais elementos de dados do formulário , como comentar ou arquivar tags etc., como foi o meu caso. Por isso, gostaria de adicioná-lo aqui, pois era meu caso de uso, para que pudesse ajudar outras pessoas.

curl -POST -F comment=mycomment -F file_type=XLSX -F file_data=@/your/path/to/file.XLSX http://yourhost.example.com/api/example_url
Menino vermelho
fonte