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.

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


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.