Wyślij żądanie POST z danymi określonymi w pliku przez Curl

241

Muszę wysłać żądanie POST przez Curl z wiersza poleceń. Dane dla tego żądania znajdują się w pliku. Wiem, że poprzez PUT można to zrobić z --upload-fileopcją.

curl host:port/post-file -H "Content-Type: text/xml" --data "contents_of_file"
rozmnażać się
źródło
Sprawdź moją odpowiedź, stackoverflow.com/questions/6213509/send-json-post-using-php/…
Muhammad Zeeshan,
1
Przepraszam, może omyłkowo opisałem mój problem. Muszę wysłać zapytanie nie przez php-curl, ale po prostu przez polecenie curl z wiersza poleceń z systemu Linux.
rozmnażają się

Odpowiedzi:

362

Szukasz --data-binaryargumentu:

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

W powyższym przykładzie -iwypisuje wszystkie nagłówki, aby zobaczyć, co się dzieje, i -X POSTwyraźnie zaznacza, że ​​jest to post. Oba można bezpiecznie pominąć bez zmiany zachowania na przewodzie. Ścieżka do pliku musi być poprzedzona @symbolem, więc curlumie czytać z pliku.

Richard J.
źródło
@ ɢʜʘʂʈʀɛɔʘɴ w tym przypadku byłoby.xml
dennismonsewicz
54
ta @część jest niezwykle ważna!
Ron Klein
Więc używamy parametru --data-binary, ale rzeczywista zawartość pliku może być tekstem? Ponieważ XML nie jest zwykle binarny.
David
8
właściwie możesz użyć flagi -d
Anatolij Jakimczuk,
16
@ Tol182 -dspowoduje usunięcie curlnowych linii, ale --data-binarynie zrobi tego.
Acumenus
44

Muszę wysłać żądanie POST przez Curl z wiersza poleceń. Dane do tego żądania znajdują się w pliku ...

Wszystko, co musisz zrobić, to --datarozpocząć argument od @:

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

Na przykład, jeśli masz dane w nazwie pliku stuff.xml, zrobiłbyś coś takiego:

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

stuff.xmlNazwa pliku może być zastąpiony względną lub pełną ścieżkę dostępu do pliku: @../xml/stuff.xml, @/var/tmp/stuff.xml...

Szary
źródło
2
Jeśli chcesz wysłać nazwane pole, możesz również użyć --data "name@stuff".
Hermann
15

Jeśli używasz danych formularza do przesłania pliku, w którym należy podać nazwę parametru, możesz użyć:

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

Lucas Liu
źródło
Dziękuję Ci! 1. rozwiązanie nie działało dla mnie. parametername=naprawdę mi pomogło :)
Cyborg
3

Większość odpowiedzi jest tutaj idealna, ale kiedy wylądowałem tutaj z powodu mojego konkretnego problemu, muszę przesłać plik binarny (arkusz kalkulacyjny XLSX) metodą POST, brakuje jednej rzeczy , tj. Zwykle nie jest to tylko plik, który ładujesz, możesz mieć więcej elementów danych formularza , takich jak komentarz do pliku lub znaczniki do pliku itp., jak to miało miejsce w moim przypadku. Dlatego chciałbym dodać go tutaj, ponieważ był to mój przypadek użycia, aby mógł pomóc innym.

curl -POST -F comment=mycomment -F file_type=XLSX -F file_data=@/your/path/to/file.XLSX http://yourhost.example.com/api/example_url
Czerwony chłopiec
źródło