Curl kullanarak çoklu bölüm / form verilerini POST yapmak için doğru yol nedir?


164

Bu sözdizimini bazı parametrelerle birlikte bir dosya göndermek için kullandım:

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

Dosya yaklaşık 500K boyutundadır. Her şeyden önce, içerik uzunluğunun iletim tarafında 254 olduğunu görüyorum. Daha sonra sunucu yanıtının içerik uzunluğu 0'dır. Nerede yanlış yapıyorum?

İşte komutun tam izi.

* 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

Yanıtlar:


254

Aşağıdaki sözdizimi sizin için düzeltir:

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

Windows & curl.exe dosyası nedir?
Piotr

1
birden fazla eke ne dersiniz?
Hellboy

8
Windows'da tam olarak aynı şekilde çalışır ve birden çok "eki" / dosyayı destekler: sadece daha fazla -F örneği ekleyin!
Daniel Stenberg

Bu yanıtın birden fazla dosya yüklemek için iyi bir örneği var. stackoverflow.com/questions/11599957/…
bmoran

Bu çalışıyor. bukle üzerine böyle bir şey eklememiz gerekmez:-H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW'
Emily

19

Windows'da curl kullanarak bir dosya yüklemek için yolun kaçmış çift tırnak gerektirdiğini gördüm

Örneğin

curl -v -F 'upload=@\"C:/myfile.txt\"' URL

1
Bu cevap bana çok yardımcı oldu. Benim durumumda kaçmamam gerekse de ", Mac'teki durumumda böyle göndermeliyim curl -X POST -F key1=value1 -F 'image=@"/Users/ivkremer/Downloads/file name.jpg"';
ivkremer

benim durumumda - herhangi bir alıntı olmadan bir başarı transferi vardı: curl -v -F file=@/Users/path/to/file/testq.jpg 192.168.0.101:8080/upload-image
chatlanin

Windows benim durumumda, tek tırnak kullanamadı ve böyle çift tırnak kullanmak zorundacurl -F "filename=@\"C:\temp\file.jpg\"" https://someurl.com
Beems

5

Bu benim için işe yaradı

curl -F file=@filename URL

1

curlBir Java arka ucuna ile çok parçalı bir HTTP PUT isteği göndermek zor bir zaman geçirdim . Sadece denedim

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

ve dosyanın içeriği

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

ancak her zaman sınırın yanlış olduğuna dair bir hata aldım. Bazı Java arka uç hata ayıklamasından sonra, Java uygulamasının \r\n--sınıra önek eklediğini öğrendim , bu nedenle girdi dosyamı

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

her şey iyi çalışıyor!

tl; Dr.

\r\nÇok parçalı sınır içeriğinin --başına ve sınırların başına bir satırsonu (CRLF ) ekleyin ve tekrar deneyin.

Belki bir Java arka ucuna sınırda bu değişikliklerin yapılması için bir istek gönderiyorsunuz.


Firefox web konsolu ile POST verilerini kopyalarken, \nbunun yerine kullandığını da fark ettim \r\n. CURL olarak mitmproxy kopya bile kullanıyordu, \nbu yüzden ham isteği mitmproxy ile kopyalamak zorunda kaldım. Hexdump ile 0Abunun yerine hex kodu kullandığını gördüm 0D 0A.
baptx


0

Windows 10'da, powershell içinde 7.28.1'i kıvırın, benim için çalışmak için aşağıdakileri buldum:

$filePath = "c:\temp\dir with spaces\myfile.wav"
$curlPath = ("myfilename=@" + $filePath)
curl -v -F $curlPath URL
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.