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"


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.


@ ɢʜʘʂʈʀɛɔʘɴ 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, ...


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


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

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.