Apa cara yang benar untuk POST multipart / form-data menggunakan curl?

164

Saya menggunakan sintaks ini untuk mengirim file bersama dengan beberapa parameter:

curl -v -include --form "key1=value1" --form upload=localfilename URL

Ukuran file sekitar 500 ribu. Pertama-tama, saya melihat panjang konten 254 di sisi pengiriman. Kemudian panjang konten respons server adalah 0. Di mana saya salah?

Ini adalah jejak lengkap dari perintah.

* Couldn't find host xxx.xxx.xxx.xxx in the _netrc file; using defaults
* About to connect() to xxx.xxx.xxx.xxx port yyyy (#0)
*   Trying xxx.xxx.xxx.xxx...
* Adding handle: conn: 0x4b96a0
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x4b96a0) send_pipe: 1, recv_pipe: 0
* Connected to xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx) port yyyy (#0)
* POST /zzzzzz/UploadFile HTTP/1.1
* User-Agent: curl/7.32.0
* Host: xxx.xxx.xxx.xxx:yyyy
* Accept: */*
* Content-Length: 254
* Expect: 100-continue
* Content-Type: multipart/form-data; boundary=------------------------948a6137eef50079
*
* HTTP/1.1 100 Continue
* HTTP/1.1 100 Continue

* HTTP/1.1 200 OK
* HTTP/1.1 200 OK
* Server Apache-Coyote/1.1 is not blacklisted
* Server: Apache-Coyote/1.1
* Server: Apache-Coyote/1.1
* Added cookie JSESSIONID="C1D7DD042E250211D9DEA82688876F88" for domain xxx.xxx.xxx.xxx, path /zzzzz/, expire 0
* Set-Cookie: JSESSIONID=C1D7DD042E250211D9DEA82688876F88; Path=/zzzzzz/;
* HttpOnly
* Set-Cookie: JSESSIONID=C1D7DD042E250211D9DEA82688876F88; Path=/zzzzzz/; HttpOnly
* Content-Type: text/html;charset=ISO-8859-1
Content-Type: text/html;charset=ISO-8859-1
* Content-Length: 0
* Content-Length: 0
* Date: Tue, 01 Oct 2013 11:54:24 GMT
* Date: Tue, 01 Oct 2013 11:54:24 GMT
* Connection #0 to host xxx.xxx.xxx.xxx left intact
Kamalakshi
sumber
kemungkinan duplikat Menggunakan curl untuk mengunggah data POST dengan file
Ciro Santilli 郝海东 冠状 病 六四 事件 事件

Jawaban:

254

Sintaks berikut memperbaikinya untuk Anda:

curl -v -F key1=value1 -F upload=@localfilename URL
Kamalakshi
sumber
bagaimana dengan Windows & curl.exe?
Piotr
1
bagaimana dengan banyak lampiran?
Hellboy
8
Ia bekerja persis sama pada Windows dan. Ia mendukung banyak "lampiran" / file: tambahkan saja -F contoh!
Daniel Stenberg
Jawaban ini memiliki contoh yang baik untuk mengunggah banyak file. stackoverflow.com/questions/11599957/…
bmoran
Ini bekerja. pada curl kita tidak perlu menambahkan sesuatu seperti ini:-H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW'
Emily
19

untuk mengunggah file menggunakan curl di Windows, saya menemukan bahwa path membutuhkan tanda kutip ganda yang diloloskan

misalnya

curl -v -F 'upload=@\"C:/myfile.txt\"' URL
Logan Scott
sumber
1
Jawaban ini banyak membantu saya. Meskipun dalam kasus saya saya tidak harus melarikan diri ", itu dalam kasus saya di Mac saya harus mengirimnya seperti curl -X POST -F key1=value1 -F 'image=@"/Users/ivkremer/Downloads/file name.jpg"';
ivkremer
dalam kasus saya - Saya mendapat transfer sukses tanpa tanda kutip: curl -v -F file=@/Users/path/to/file/testq.jpg 192.168.0.101:8080/upload-image
chatlanin
Dalam kasus saya di Windows, saya tidak bisa menggunakan tanda kutip tunggal dan harus menggunakan tanda kutip ganda seperti inicurl -F "filename=@\"C:\temp\file.jpg\"" https://someurl.com
Beems
5

Inilah yang bekerja untuk saya

curl -F file=@filename URL
smac89
sumber
1

Saya mengalami kesulitan mengirim permintaan PUT HTTP multi bagian dengan curlke Java backend. Saya hanya mencoba

curl -X PUT URL \
   --header 'Content-Type: multipart/form-data; boundary=---------BOUNDARY' \
   --data-binary @file

dan isi file itu

-----------BOUNDARY
Content-Disposition: form-data; name="name1"
Content-Type: application/xml;version=1.0;charset=UTF-8

<xml>content</xml>
-----------BOUNDARY
Content-Disposition: form-data; name="name2"
Content-Type: text/plain

content
-----------BOUNDARY--

tapi saya selalu mendapat kesalahan bahwa batas itu salah Setelah beberapa debug backend Java saya menemukan bahwa implementasi Java menambahkan \r\n--sebagai awalan ke batas, jadi setelah mengubah file input saya ke

                          <-- here's the CRLF
-------------BOUNDARY       <-- added '--' at the beginning
...
-------------BOUNDARY       <-- added '--' at the beginning
...
-------------BOUNDARY--     <-- added '--' at the beginning

semuanya bekerja dengan baik!

tl; dr

Tambahkan baris baru (CRLF \r\n) di awal konten batas multi bagian dan --di awal batas dan coba lagi.

Mungkin Anda mengirim permintaan ke backend Java yang membutuhkan perubahan dalam batas ini.

Lusk116
sumber
Saat menyalin data POST dengan konsol web Firefox, saya juga memperhatikan bahwa itu menggunakan \nalih-alih \r\n. Bahkan salinan mitmproxy seperti yang digunakan CURL \njadi saya harus menyalin permintaan mentah dengan mitmproxy. Saya melihat dengan hexdump bahwa itu menggunakan kode hex 0Abukan 0D 0A.
baptx
yang \r\ndiperlukan. Lihatlah tools.ietf.org/html/rfc2046#section-5.1.1 halaman 19.
Adam Zahran
0

Pada Windows 10, curl 7.28.1 dalam PowerShell, saya menemukan hal berikut ini berfungsi untuk saya:

$filePath = "c:\temp\dir with spaces\myfile.wav"
$curlPath = ("myfilename=@" + $filePath)
curl -v -F $curlPath URL
Mat
sumber