मल्टीपार्ट / फॉर्म-डेटा का उदाहरण


103

मैं सोच रहा हूं कि क्या कोई मेरे साथ मल्टीपार्ट / फॉर्म-डेटा का उदाहरण साझा कर सकता है:

  1. कुछ फार्म पैरामीटर
  2. कई फाइलें

2
यहां जाएं: w3.org/TR/html401/interact/forms.html#h-17.13.4 में 17.13.4 Form content typesआप क्या चाहते हैं मिल जाएगा।
एंड्रयू बार्बर



मल्टीपार्ट अपलोड टुकड़ों द्वारा बड़ी फ़ाइलों को अपलोड करता है। मल्टीफ़ाइल अपलोड कई छोटी फ़ाइलों को अपलोड करता है। आप किस बारे में पूछ रहे हैं?
गंगनुस

जवाबों:


126

संपादित करें : मैं एक समान, लेकिन अधिक गहराई से उत्तर दे रहा हूं: https://stackoverflow.com/a/28380690/895245

वास्तव में क्या हो रहा है यह देखने के लिए, nc -lएक ECHO सर्वर और एक ब्राउज़र या cURL जैसे उपयोगकर्ता एजेंट का उपयोग करें।

फ़ॉर्म को .htmlफ़ाइल में सहेजें :

<form action="http://localhost:8000" method="post" enctype="multipart/form-data">
  <p><input type="text" name="text" value="text default">
  <p><input type="file" name="file1">
  <p><input type="file" name="file2">
  <p><button type="submit">Submit</button>
</form>

अपलोड करने के लिए फ़ाइलें बनाएँ:

echo 'Content of a.txt.' > a.txt
echo '<!DOCTYPE html><title>Content of a.html.</title>' > a.html

Daud:

nc -l localhost 8000

अपने ब्राउज़र पर HTML खोलें, फाइलों का चयन करें और सबमिट पर क्लिक करें और टर्मिनल की जांच करें।

ncप्राप्त अनुरोध को प्रिंट करता है। फ़ायरफ़ॉक्स भेजा:

POST / HTTP/1.1
Host: localhost:8000
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:29.0) Gecko/20100101 Firefox/29.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Cookie: __atuvc=34%7C7; permanent=0; _gitlab_session=226ad8a0be43681acf38c2fab9497240; __profilin=p%3Dt; request_method=GET
Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------9051914041544843365972754266
Content-Length: 554

-----------------------------9051914041544843365972754266
Content-Disposition: form-data; name="text"

text default
-----------------------------9051914041544843365972754266
Content-Disposition: form-data; name="file1"; filename="a.txt"
Content-Type: text/plain

Content of a.txt.

-----------------------------9051914041544843365972754266
Content-Disposition: form-data; name="file2"; filename="a.html"
Content-Type: text/html

<!DOCTYPE html><title>Content of a.html.</title>

-----------------------------9051914041544843365972754266--

Aternativelly, cURL को आपके ब्राउज़र फॉर्म के समान POST अनुरोध भेजना चाहिए:

nc -l localhost 8000
curl -F "text=default" -F "file1=@a.html" -F "file1=@a.txt" localhost:8000

आप इसके साथ कई परीक्षण कर सकते हैं:

while true; do printf '' | nc -l localhost 8000; done

41
अप्रिय और गैर-तत्काल-स्पष्ट सामग्री: डेटा में वास्तविक सीमाओं boundary=---------------------------9051914041544843365972754266से दो हाइफ़न कम है । यह वास्तव में है, वास्तव में सभी हाइफ़न को एक साथ घूमते हुए देखना कठिन है।
नकली नाम

1
curl --trace-ascii <logfilename> ..... भेजा और प्राप्त डेटा देखने के लिए भी उपयोगी है।
क्रेग हिक्स

curl -trace <logfilename> ....बाइनरी भी दिखाएगा। अवलोकन करने के लिए <LF> बनाम <CR> <LF>।
क्रेग हिक्स

@ फ़ेकनाम - यह सीमा स्वतः कर्ल द्वारा बनाई गई थी।
क्रेग हिक्स

6
सीमा हमेशा छोटी होती है। प्रत्येक MIME अनुभाग विभाजक (सीमा) में सामने में दो अतिरिक्त डैश होते हैं और अनुगामी सीमा विभाजक में चार अतिरिक्त डैश होते हैं: दो सामने और दो अंत में।
सेर्गेई कुजनेत्सोव

24

@Ciro Santilli जवाब के लिए बहुत धन्यवाद! मैंने पाया कि सीमा के लिए उसकी पसंद काफी "दुखी" है क्योंकि सभी हाइफ़न: वास्तव में, जैसा कि @ फ़ेक नाम ने टिप्पणी की, जब आप अनुरोध के अंदर अपनी सीमा का उपयोग कर रहे हैं तो यह सामने दो और हाइफ़न के साथ आता है:

उदाहरण:

POST / HTTP/1.1
HOST: host.example.com
Cookie: some_cookies...
Connection: Keep-Alive
Content-Type: multipart/form-data; boundary=12345

--12345
Content-Disposition: form-data; name="sometext"

some text that you wrote in your html form ...
--12345
Content-Disposition: form-data; name="name_of_post_request" filename="filename.xyz"

content of filename.xyz that you upload in your form with input[type=file]
--12345
Content-Disposition: form-data; name="image" filename="picture_of_sunset.jpg"

content of picture_of_sunset.jpg ...
--12345--

मैंने इस w3.org पेज पर पाया कि मल्टीपार्ट / फॉर्म-डेटा में मल्टीपार्ट / मिक्स्ड हैडर को असंगत करना संभव है, बस मल्टीपार्ट / मिक्स के अंदर एक और बाउंड्री स्ट्रिंग का चयन करना और उस एक का उपयोग करके डेटा को इनकैप्सुलेट करना है। अंत में, आपको POST अनुरोध को बंद करने के लिए FILO क्रम में उपयोग की जाने वाली सभी सीमाओं को "बंद" करना होगा (जैसे:

POST / HTTP/1.1
...
Content-Type: multipart/form-data; boundary=12345

--12345
Content-Disposition: form-data; name="sometext"

some text sent via post...
--12345
Content-Disposition: form-data; name="files"
Content-Type: multipart/mixed; boundary=abcde

--abcde
Content-Disposition: file; file="picture.jpg"

content of jpg...
--abcde
Content-Disposition: file; file="test.py"

content of test.py file ....
--abcde--
--12345--

ऊपर दिए गए लिंक पर एक नज़र डालें।


1
क्यों आप में सभी गुण अलग नहीं है Content-Dispositionके साथ ;?
केलिन

1
'> ई <ncapsulate'
क्रेग हिक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.