Cara mengirim konten file sebagai entitas badan menggunakan cURL

207

Saya menggunakan utilitas baris perintah cURL untuk mengirim HTTP POST ke layanan web. Saya ingin memasukkan konten file sebagai entitas tubuh POST. Saya sudah mencoba menggunakan -d </path/to/filename>juga varian lain dengan tipe info seperti --data </path/to/filename> --data-urlencode </path/to/filename>dll ... file selalu terlampir. Saya membutuhkannya sebagai entitas tubuh.

Roy Hinkley
sumber

Jawaban:

338

Saya yakin Anda mencari @filenamesintaksis, misalnya:

strip garis baru

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

pertahankan baris baru

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

=====

curl akan menghapus semua baris baru dari file. Jika Anda ingin mengirim file dengan baris baru utuh, gunakan --data-binarysebagai ganti --data

Jeffrey Froman
sumber
21
Jika Anda ingin benar-benar mewah, Anda dapat melakukannya: cat file.txt | curl --data "@-" `(< url.txt )` @-memberi tahu curl untuk membaca dari stdin. Anda juga bisa menggunakan redirect (< x.txt )untuk memasukkan apa pun yang Anda inginkan. Jika Anda menggunakan bash.
Breedly
62
curl akan menghapus semua baris baru dari file. Jika Anda ingin mengirim file dengan baris baru utuh, gunakan --data-binarydi tempat --data.
Chris
sekarang bagaimana cara menambahkan kredensial masuk untuk mengesahkan permintaan ini?
anon58192932
@ anon58192932 - Itu tergantung pada protokol keamanan server. Jika Anda menggunakan name:valuepasangan, seperti nama pengguna dan kata sandi, maka tambahkan tajuk yang diperlukan yang cocok dengan apa yang diharapkan oleh layanan: --header: "<header_name>:<header_value>"sebagai satu string.
Roy Hinkley
19

Saya tahu pertanyaannya telah dijawab, tetapi dalam kasus saya, saya mencoba mengirim konten file teks ke api Slack Webhook dan untuk beberapa alasan jawaban di atas tidak berfungsi. Siapa pun, inilah yang akhirnya melakukan trik untuk saya:

curl -X POST -H --silent --data-urlencode "payload={\"text\": \"$(cat file.txt | sed "s/\"/'/g")\"}" https://hooks.slack.com/services/XXX
cukup masak
sumber
Yang ini tidak mengonversi titik menjadi garis bawah (. -> _) dan mempertahankan baris baru. Terima kasih!
Ramon Fincken
1
Ini keren, tetapi tidak menjawab pertanyaan karena file tersebut meledak pada baris perintah alih-alih ditentukan untuk curl. Saya juga bertanya-tanya apakah semua karakter khusus shell perlu melarikan diri - tetapi saya tidak cukup tahu tentang itu;)
Gerard ONeill
Terima kasih, kamu menyelamatkan hidupku!
aryswisnu
Untuk file konten yang besar, ikal di atas tidak akan berfungsi, curl: argument list too longdalam hal ini jawaban yang diterima adalah penyelamat hidupcurl --data "@/path/to/filename" http://...
Pembuat kode lainnya
0

Dalam kasus saya, @menyebabkan semacam masalah penyandian, saya masih lebih suka cara lama saya:

curl -d "$(cat /path/to/file)" https://example.com
wbswjc
sumber