Jak wysłać zawartość pliku jako byt ciała za pomocą cURL

207

Korzystam z narzędzia wiersza polecenia cURL, aby wysłać HTTP POST do usługi internetowej. Chcę zawrzeć zawartość pliku jako jednostkę treści POST. Próbowałem używać, -d </path/to/filename>podobnie jak innych wariantów, informacji typu, takich jak --data </path/to/filename> --data-urlencode </path/to/filename>itp. ... plik jest zawsze dołączany. Potrzebuję tego jako bytu ciała.

Roy Hinkley
źródło

Odpowiedzi:

338

Myślę, że szukasz @filenameskładni, np .:

usuń nowe linie

curl --data "@/path/to/filename" http://...

zachowaj nowe linie

curl --data-binary "@/path/to/filename" http://...

=====

curl usunie wszystkie nowe wiersze z pliku. Jeśli chcesz wysłać plik z nienaruszonymi --data-binaryznakami nowej linii, użyj zamiast --data

Jeffrey Froman
źródło
21
Jeśli chcesz być naprawdę fantazyjny, możesz to zrobić: cat file.txt | curl --data "@-" `(< url.txt )` @-każe curl czytać ze standardowego wejścia. Możesz także użyć przekierowania, (< x.txt )aby wstawić cokolwiek chcesz. Jeśli używasz bash.
Breedly,
62
curl usunie wszystkie nowe wiersze z pliku. Jeśli chcesz wysłać plik z nienaruszonymi znakami nowej linii, użyj --data-binaryzamiast --data.
Chris
teraz jak dodać dane logowania, aby autoryzować to żądanie?
anon58192932
@ anon58192932 - To zależy od protokołu bezpieczeństwa serwera. Jeśli używasz name:valuepar, takich jak nazwa użytkownika i hasło, dodaj niezbędne nagłówki zgodne z oczekiwaniami usługi: --header: "<header_name>:<header_value>"jako pojedynczy ciąg.
Roy Hinkley,
19

Wiem, że pytanie zostało udzielone, ale w moim przypadku próbowałem wysłać zawartość pliku tekstowego do interfejsu Slack Webhook i z jakiegoś powodu powyższa odpowiedź nie zadziałała. Tak czy inaczej, oto co w końcu zrobiło dla mnie lewę:

curl -X POST -H --silent --data-urlencode "payload={\"text\": \"$(cat file.txt | sed "s/\"/'/g")\"}" https://hooks.slack.com/services/XXX
gotowane ciasto
źródło
Ten nie konwertuje kropek na podkreślenia (. -> _) i zachowuje nowe linie. Dzięki!
Ramon Fincken
1
To jest fajne, ale nie odpowiada na pytanie, ponieważ plik jest eksplodowany w wierszu polecenia, a nie jest określony do zwijania. Zastanawiam się także, czy trzeba uciec od wszystkich specjalnych postaci pocisku - ale nie wiem o tym wystarczająco;)
Gerard ONeill,
Dzięki, uratowałeś mi życie!
aryswisnu
W przypadku dużego pliku zawartości powyższe zawijanie nie będzie działać, curl: argument list too longw takim przypadku zaakceptowaną odpowiedzią jest oszczędzanie życiacurl --data "@/path/to/filename" http://...
inny programista