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

Jawaban:


254

Sintaks berikut memperbaikinya untuk Anda:

curl -v -F key1=value1 -F upload=@localfilename URL

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

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

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.


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
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.