कर्ल का उपयोग करके POST मल्टीपार्ट / फॉर्म-डेटा का सही तरीका क्या है?


164

मैंने कुछ मापदंडों के साथ फाइल पोस्ट करने के लिए इस सिंटैक्स का उपयोग किया है:

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

फ़ाइल लगभग 500K आकार में है। सबसे पहले, मैं संचारित पक्ष पर सामग्री की लंबाई 254 देखता हूं। बाद में सर्वर की प्रतिक्रिया की सामग्री की लंबाई 0. मैं गलत कहां जा रहा हूं?

यहां कमांड का पूरा निशान है।

* 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

जवाबों:


254

निम्न सिंटैक्स आपके लिए इसे ठीक करता है:

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

Windows और curl.exe के बारे में क्या?
पियोट्र

1
कई अनुलग्नकों के बारे में क्या?
हेलबॉय

8
यह विंडोज पर बिल्कुल वैसा ही काम करता है और यह कई "अटैचमेंट्स" / फाइलों का समर्थन करता है: बस अधिक -F इंस्टेंस जोड़ें!
डैनियल स्टेनबर्ग

इस उत्तर में कई फ़ाइलों को अपलोड करने का एक अच्छा उदाहरण है। stackoverflow.com/questions/11599957/…
bmoran

यह काम। कर्ल पर हमें ऐसा कुछ जोड़ने की आवश्यकता नहीं है:-H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW'
एमिली

19

Windows में कर्ल का उपयोग करके एक फ़ाइल अपलोड करने के लिए मैंने पाया कि पथ को दोहरे उद्धरण से बचने की आवश्यकता है

जैसे

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

1
इस जवाब ने मुझे बहुत मदद की। हालाँकि मेरे मामले में मुझे बचना नहीं चाहिए ", लेकिन मैक पर मेरे मामले में मुझे इसे भेजना चाहिए curl -X POST -F key1=value1 -F 'image=@"/Users/ivkremer/Downloads/file name.jpg"';
ivkremer

मेरे मामले में - मेरे पास बिना किसी उद्धरण के एक सफलता हस्तांतरण था: कर्ल -v -F फ़ाइल=@
User

Windows में मेरे मामले में, मैं सिंगल कोट्स इस्तेमाल कर सकते हैं नहीं और था इस तरह दोहरे उद्धरण चिह्नों का उपयोग करनेcurl -F "filename=@\"C:\temp\file.jpg\"" https://someurl.com
Beems


1

मेरे पास curlएक जावा बैकएंड के साथ मल्टीपार्ट HTTP पुत अनुरोध भेजने में एक कठिन समय था । मैंने बस कोशिश की

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

और फ़ाइल की सामग्री थी

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

लेकिन मुझे हमेशा एक त्रुटि मिली कि सीमा गलत थी। कुछ जावा बैकएंड डिबगिंग के बाद मुझे पता चला कि जावा कार्यान्वयन \r\n--सीमा के लिए एक उपसर्ग के रूप में जोड़ रहा था , इसलिए इनपुट इनपुट फ़ाइल को बदलने के बाद

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

सब कुछ ठीक काम करता है!

tl; डॉ

\r\nमल्टीपार्ट सीमा सीमा की --शुरुआत में और सीमाओं की शुरुआत में एक नई पंक्ति (CRLF ) जोड़ें और पुनः प्रयास करें।

हो सकता है कि आप एक जावा बैकएंड को एक अनुरोध भेज रहे हैं जिसे सीमा में इस बदलाव की आवश्यकता है।


फ़ायरफ़ॉक्स वेब कंसोल के साथ POST डेटा कॉपी करते समय, मैंने यह भी देखा कि इसके \nबजाय इसका उपयोग किया गया था \r\n। यहां तक ​​कि मित्रोप्रॉक्सी कॉपी भी, क्योंकि CURL का उपयोग \nकिया जा रहा था, इसलिए मुझे मित्प्रॉक्सी के साथ कच्चे अनुरोध को कॉपी करना पड़ा। मैंने हेक्सडंप के साथ देखा कि वह 0Aइसके बजाय हेक्स कोड का उपयोग कर रहा था 0D 0A
बपतिस्मा

\r\nआवश्यक है। को देखो tools.ietf.org/html/rfc2046#section-5.1.1 पेज 19
एडम Zahran

0

विंडोज 10 पर, शार्पशेल के भीतर 7.28.1 कर्ल करें, मुझे मेरे लिए काम करने के लिए निम्नलिखित मिला:

$filePath = "c:\temp\dir with spaces\myfile.wav"
$curlPath = ("myfilename=@" + $filePath)
curl -v -F $curlPath URL
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.