Kirim Permintaan POST dengan Data Yang Ditentukan dalam File melalui Curl

242

Saya perlu membuat permintaan POST melalui Curl dari baris perintah. Data untuk permintaan ini terletak di file. Saya tahu bahwa melalui PUT ini dapat dilakukan dengan --upload-fileopsi.

curl host:port/post-file -H "Content-Type: text/xml" --data "contents_of_file"
trah
sumber
1
Maaf mungkin saya keliru menggambarkan masalah saya, saya perlu mengirim permintaan tidak melalui php-curl tetapi hanya melalui perintah curl dari command line dari linux os.
breedish

Jawaban:

364

Anda mencari --data-binaryargumen:

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

Pada contoh di atas, -icetak semua header sehingga Anda dapat melihat apa yang terjadi, dan -X POSTbuat secara eksplisit bahwa ini adalah posting. Kedua hal ini dapat dihilangkan dengan aman tanpa mengubah perilaku pada kabel. Jalur ke file harus didahului oleh @simbol, jadi curltahu membaca dari file.

Richard J
sumber
@ ɢʜʘʂʈʀɛɔʘɴ dalam hal ini akan.xml
dennismonsewicz
54
yang @bagian sangat penting!
Ron Klein
Jadi kita menggunakan parameter --data-binary, tetapi konten file yang sebenarnya bisa berupa teks? Karena XML biasanya bukan biner.
David
8
sebenarnya Anda dapat menggunakan hanya -d flag
Anatoly Yakimchuk
16
@ Tol182 -dakan menyebabkan curlstrip baru, tetapi --data-binarytidak akan.
Acumenus
45

Saya perlu membuat permintaan POST melalui Curl dari baris perintah. Data untuk permintaan ini terletak di file ...

Yang perlu Anda lakukan adalah --datamemulai argumen dengan @:

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

Misalnya, jika Anda memiliki data dalam file yang dipanggil stuff.xmlmaka Anda akan melakukan sesuatu seperti:

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

The stuff.xmlnama file bisa diganti dengan path relatif atau penuh ke file: @../xml/stuff.xml, @/var/tmp/stuff.xml, ...

Abu-abu
sumber
2
Jika Anda perlu mengirim bidang bernama, Anda juga dapat menggunakan --data "name@stuff".
Hermann
15

Jika Anda menggunakan data formulir untuk mengunggah file, di mana nama parameter harus ditentukan, Anda bisa menggunakan:

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

Lucas Liu
sumber
Terima kasih! 1. Solusi tidak berhasil untuk saya. parametername=benar-benar membantu saya :)
Cyborg
3

Sebagian besar jawaban sempurna di sini, tetapi ketika saya mendarat di sini untuk masalah khusus saya, saya harus mengunggah file biner (lembar spread XLSX) menggunakan metode POST, saya melihat satu hal yang hilang , yaitu biasanya bukan hanya file yang Anda muat, Anda mungkin memiliki lebih banyak elemen data formulir , seperti komentar ke file atau tag ke file dll seperti kasus saya. Karenanya, saya ingin menambahkannya di sini karena ini adalah kasus penggunaan saya, sehingga dapat membantu orang lain.

curl -POST -F comment=mycomment -F file_type=XLSX -F file_data=@/your/path/to/file.XLSX http://yourhost.example.com/api/example_url
Bocah Merah
sumber