কার্ল ব্যবহার করে 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

উইন্ডোজ ও কার্ল.এক্সএ সম্পর্কে কি?
পাইওটার

1
একাধিক সংযুক্তি সম্পর্কে কি?
Hellboy

8
এটি উইন্ডোজে ঠিক একই কাজ করে এবং এটি একাধিক "সংযুক্তি" / ফাইলগুলিকে সমর্থন করে: কেবল আরও -এফ উদাহরণ যুক্ত করুন!
ড্যানিয়েল স্টেনবার্গ

এই উত্তরে একাধিক ফাইল আপলোড করার একটি ভাল উদাহরণ রয়েছে। stackoverflow.com/questions/11599957/...
bmoran

এইটা কাজ করে. কার্ল এ আমাদের এর মতো কিছু যুক্ত করার দরকার নেই:-H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW'
এমিলি

19

উইন্ডোজে কার্ল ব্যবহার করে একটি ফাইল আপলোড করতে আমি দেখতে পেলাম যে পথটির জন্য ডাবল কোট দিয়ে পালানো দরকার

যেমন

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

1
এই উত্তরটি আমাকে অনেক সাহায্য করেছিল। যদিও আমার ক্ষেত্রে আমার পালানো উচিত নয় ", এটি ম্যাকের ক্ষেত্রে আমার পক্ষে এটি পাঠানো উচিত curl -X POST -F key1=value1 -F 'image=@"/Users/ivkremer/Downloads/file name.jpg"';
ivkremer

আমার ক্ষেত্রে - আমার কোনও উদ্ধৃতি ছাড়াই সাফল্য স্থানান্তর হয়েছিল: curl -v -F file=@/User/path/to/file/testq.jpg 192.168.0.101:8080/upload-image
চ্যাটলিনিন

উইন্ডোজে আমার ক্ষেত্রে, আমি একক উদ্ধৃতি ব্যবহার করতে পারিনি এবং এর মতো ডাবল উদ্ধৃতি ব্যবহার করতে হয়েছিলcurl -F "filename=@\"C:\temp\file.jpg\"" https://someurl.com
বিএমস

5

এটিই আমার পক্ষে কাজ করেছিল

curl -F file=@filename URL

1

curlজাভা ব্যাকএন্ডে মাল্টিপার্ট এইচটিটিপি পুট অনুরোধ প্রেরণে আমার খুব কষ্ট হয়েছিল । আমি সহজভাবে চেষ্টা করেছি

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মাল্টিপার্ট সীমানা সামগ্রীর --শুরুতে এবং সীমানার শুরুতে একটি নতুন লাইন (সিআরএলএফ ) যুক্ত করুন এবং আবার চেষ্টা করুন।

হতে পারে আপনি জাভা ব্যাকএন্ডে একটি অনুরোধ পাঠাচ্ছেন যার সীমানায় এই পরিবর্তনগুলি দরকার।


ফায়ারফক্স ওয়েব কনসোল দিয়ে পোষ্ট ডেটা অনুলিপি করার সময়, আমি এটাও লক্ষ্য করেছি যে এটি \nপরিবর্তে ব্যবহার করছে \r\n। এমনকি সিআরএল হিসাবে mitmproxy অনুলিপি ব্যবহার করছিল \nতাই আমাকে mitmproxy দিয়ে কাঁচা অনুরোধটি অনুলিপি করতে হয়েছিল। আমি হেক্সডাম্পের সাথে দেখেছি যে এটি হেক্স কোড 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.