Saya ingin menggunakan cURL untuk tidak hanya mengirim parameter data dalam HTTP POST tetapi juga mengunggah file dengan nama formulir tertentu. Bagaimana saya harus melakukan itu?
Parameter Posting HTTP:
userid = 12345 filecomment = Ini adalah file gambar
Unggah File HTTP: Lokasi file = /home/user1/Desktop/test.jpg Nama formulir untuk file = gambar (sesuai dengan $ _FILES ['gambar'] di sisi PHP)
Saya menganggap bagian dari perintah CURL sebagai berikut:
curl -d "userid=1&filecomment=This is an image file" --data-binary @"/home/user1/Desktop/test.jpg" localhost/uploader.php
Masalah yang saya dapatkan adalah sebagai berikut:
Notice: Undefined index: image in /var/www/uploader.php
Masalahnya adalah saya menggunakan $ _FILES ['gambar'] untuk mengambil file dalam skrip PHP.
Bagaimana cara menyesuaikan perintah CURL saya?
-d
opsi secara tidak sengaja, yang membutuhkan input URL-disandikan. Saya seharusnya menghapus itu ketika saya memperbarui jawaban untuk-F
opsi. Terima kasih sudah menangkapnya.@
diimage=@/..
?Menangkap id pengguna sebagai variabel jalur (disarankan):
Menangkap id pengguna sebagai bagian dari formulir:
atau:
sumber
"Content-Type: multipart/form-data"
Inilah solusi saya, saya telah membaca banyak posting dan mereka sangat membantu. Akhirnya saya menulis beberapa kode untuk file kecil, dengan cURL dan PHP yang menurut saya sangat berguna.
Dengan ini kita harus berada di "api.endpoint.post" vars berikut diposting. Anda dapat dengan mudah menguji dengan skrip ini, dan Anda harus menerima debug ini pada fungsi
postFile()
di baris terakhir.Seharusnya bekerja dengan baik, mereka mungkin solusi yang lebih baik tetapi ini berfungsi dan sangat membantu untuk memahami bagaimana Bimeary dan multipart / dari-data mime bekerja di PHP dan perpustakaan CURL.
sumber
jika Anda mengunggah file biner seperti csv, gunakan format di bawah ini untuk mengunggah file
sumber
--data-binary
menginstruksikancurl
untuk tidak melakukan pra-pemrosesan data, sebagai lawan dari--data
flag. untuk menanggapi komentar Anda secara langsung, perhatikan bahwa teks juga biner, tetapi kami dapat menafsirkannya sebagai karakter ASCII. Jika Anda benar-benar menginginkan contoh berbeda, pikirkan tentang CSV yang isinya berisi emoji. Bytes mereka tidak langsung dipetakan ke teksMasalah yang membawa saya ke sini ternyata merupakan kesalahan pengguna dasar - saya tidak memasukkan
@
tanda di jalur file dan jadi ikal memposting path / nama file daripada konten. TheContent-Length
sehingga nilai adalah 8 daripada 479 yang saya harapkan untuk lihat mengingat legnth file pengujian saya.The
Content-Length
header akan otomatis dihitung ketika ikal membaca dan posting file.curl -i -H "Content-Type: application/xml" --data "@test.xml" -v -X POST https://<url>/<uri/
... <Panjang Konten: 479 ...
Posting ini di sini untuk membantu pemula lain di masa depan.
sumber
Sebagai alternatif
curl
, Anda dapat menggunakan HTTPie , itu CLI, alat seperti Curl untuk manusia.Petunjuk instalasi: https://github.com/jakubroztocil/httpie#installation
Lalu lari:
sumber
Setelah banyak mencoba, perintah ini berhasil untuk saya:
sumber
Berikut adalah cara keluar dari nama file yang diunggah dengan file sewenang-wenang dengan
bash
:sumber
Saya berhasil dengan perintah ini
curl -F 'filename=@/home/yourhomedirextory/file.txt' http://yourserver/upload
sumber