html - Enctype='multipart/form-data' का अर्थ क्या है?




http-headers (6)

हमें इसका इस्तेमाल कब करना चाहिए

क्वांटिन का जवाब सही है: यदि multipart/form-data उपयोग करें, तो फॉर्म में फ़ाइल अपलोड होता है, और application/x-www-form-urlencoded अन्यथा, यदि आप enctype छोड़ देते हैं तो डिफ़ॉल्ट है।

मैं जा रहा हूँ:

  • कुछ और एचटीएमएल 5 संदर्भ जोड़ें
  • समझाओ कि वह एक फॉर्म के साथ सही क्यों है उदाहरण सबमिट करें

एचटीएमएल 5 संदर्भ

enctype लिए तीन संभावनाएं हैं:

  • x-www-urlencoded
  • multipart/form-data ( RFC7578 पर RFC7578 )
  • text-plain यह "कंप्यूटर द्वारा विश्वसनीय रूप से व्याख्या योग्य नहीं है", इसलिए इसे कभी भी उत्पादन में उपयोग नहीं किया जाना चाहिए, और हम इसमें आगे नहीं देखेंगे।

उदाहरण कैसे उत्पन्न करें

एक बार जब आप प्रत्येक विधि का एक उदाहरण देखते हैं, तो यह स्पष्ट हो जाता है कि वे कैसे काम करते हैं, और जब आपको प्रत्येक का उपयोग करना चाहिए।

आप उदाहरणों का उपयोग कर सकते हैं:

  • nc -l या एक ईसीएचओ सर्वर
  • एक ब्राउज़र एजेंट या ब्राउज़र जैसे उपयोगकर्ता एजेंट

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

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8"/>
  <title>upload</title>
</head>
<body>
<form action="http://localhost:8000" method="post" enctype="multipart/form-data">
  <p><input type="text" name="text1" value="text default">
  <p><input type="text" name="text2" value="a&#x03C9;b">
  <p><input type="file" name="file1">
  <p><input type="file" name="file2">
  <p><input type="file" name="file3">
  <p><button type="submit">Submit</button>
</form>
</body>
</html>

हमने डिफ़ॉल्ट टेक्स्ट मान को a&#x03C9;b , जिसका अर्थ है aωb क्योंकि ω U+03C9 , जो यूटीएफ -8 में बाइट्स 61 CF 89 62 है।

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

echo 'Content of a.txt.' > a.txt

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

# Binary file containing 4 bytes: 'a', 1, 2 and 'b'.
printf 'a\xCF\x89b' > binary

हमारे छोटे गूंज सर्वर चलाएं:

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

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

nc प्राप्त अनुरोध मुद्रित करता है।

पर परीक्षण: उबंटू 14.04.3, nc बीएसडी 1.105, फ़ायरफ़ॉक्स 40।

बहुखण्डीय / फार्म-डेटा

फ़ायरफ़ॉक्स भेजा गया:

POST / HTTP/1.1
[[ Less interesting headers ... ]]
Content-Type: multipart/form-data; boundary=---------------------------735323031399963166993862150
Content-Length: 834

-----------------------------735323031399963166993862150
Content-Disposition: form-data; name="text1"

text default
-----------------------------735323031399963166993862150
Content-Disposition: form-data; name="text2"

aωb
-----------------------------735323031399963166993862150
Content-Disposition: form-data; name="file1"; filename="a.txt"
Content-Type: text/plain

Content of a.txt.

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

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

-----------------------------735323031399963166993862150
Content-Disposition: form-data; name="file3"; filename="binary"
Content-Type: application/octet-stream

aωb
-----------------------------735323031399963166993862150--

बाइनरी फ़ाइल और टेक्स्ट फ़ील्ड के लिए बाइट्स 61 CF 89 62 (यूटीएफ -8 में aωb ) सचमुच भेजे जाते हैं। आप nc -l localhost 8000 | hd साथ सत्यापित कर सकते हैं nc -l localhost 8000 | hd , जो कहता है कि बाइट्स:

61 CF 89 62

भेजे गए थे ( 61 == 'ए' और 62 == 'बी')।

इसलिए यह स्पष्ट है कि:

  • Content-Type: multipart/form-data; boundary=---------------------------9051914041544843365972754266 Content-Type: multipart/form-data; boundary=---------------------------9051914041544843365972754266 सामग्री प्रकार को multipart/form-data सेट करता है और कहता है कि फ़ील्ड दिए गए हैं boundary स्ट्रिंग।

  • प्रत्येक फ़ील्ड को इसके डेटा से पहले कुछ उप-शीर्षलेख मिलते हैं: Content-Disposition: form-data; , क्षेत्र का name , filename , डेटा के बाद।

    सर्वर अगली सीमा स्ट्रिंग तक डेटा पढ़ता है। ब्राउज़र को ऐसी सीमा चुननी होगी जो किसी भी फ़ील्ड में दिखाई न दे, इसलिए यही कारण है कि सीमा अनुरोधों के बीच भिन्न हो सकती है।

    चूंकि हमारे पास अद्वितीय सीमा है, इसलिए डेटा का कोई एन्कोडिंग आवश्यक नहीं है: बाइनरी डेटा भेजा जाता है।

    TODO: इष्टतम सीमा आकार ( log(N) मैं शर्त क्या है), और एल्गोरिदम का नाम / चलने का समय जो इसे पाता है? यहां पूछा गया: https://cs.stackexchange.com/questions/39687/find-the-shortest-sequence-that-is-not-a-sub-sequence-of-a-set-of-sequences

  • Content-Type स्वचालित रूप से ब्राउज़र द्वारा निर्धारित किया जाता है।

    यह कैसे निर्धारित किया जाता है कि बिल्कुल पूछा गया था: ब्राउज़र द्वारा निर्धारित अपलोड की गई फ़ाइल का माइम प्रकार कैसा है?

आवेदन / x-www फार्म-urlencoded

अब enctype को application/x-www-form-urlencoded बदलें, ब्राउज़र को फिर से लोड करें, और पुनः सबमिट करें।

फ़ायरफ़ॉक्स भेजा गया:

POST / HTTP/1.1
[[ Less interesting headers ... ]]
Content-Type: application/x-www-form-urlencoded
Content-Length: 51

text1=text+default&text2=a%CF%89b&file1=a.txt&file2=a.html&file3=binary

स्पष्ट रूप से फ़ाइल डेटा नहीं भेजा गया था, केवल बेसनाम। तो यह फ़ाइलों के लिए इस्तेमाल नहीं किया जा सकता है।

टेक्स्ट फ़ील्ड के लिए, हम देखते हैं कि a और b जैसे सामान्य प्रिंट करने योग्य वर्ण एक बाइट में भेजे गए थे, जबकि 0xCF और 0x89 जैसे गैर-प्रिंट करने योग्य वाले प्रत्येक 3 बाइट्स लेते थे: %CF%89 !

तुलना

फ़ाइल अपलोड में अक्सर बहुत सारे गैर-प्रिंट करने योग्य वर्ण होते हैं (उदाहरण के लिए छवियां), जबकि पाठ रूप लगभग कभी नहीं करते हैं।

उदाहरणों से हमने देखा है कि:

  • multipart/form-data : संदेश पर सीमा ओवरहेड के कुछ बाइट जोड़ता है, और इसे गणना करने में कुछ समय बिताना चाहिए, लेकिन प्रत्येक बाइट को एक बाइट में भेजता है।

  • application/x-www-form-urlencoded : प्रति फ़ील्ड ( & ) में एक बाइट सीमा है, लेकिन प्रत्येक गैर-प्रिंट करने योग्य वर्ण के लिए 3x का रैखिक ओवरहेड कारक जोड़ता है।

इसलिए, भले ही हम application/x-www-form-urlencoded साथ फाइलें भेज सकें, हम नहीं चाहते हैं, क्योंकि यह इतना अक्षम है।

लेकिन पाठ क्षेत्रों में पाए जाने वाले प्रिंट करने योग्य पात्रों के लिए, इससे कोई फर्क नहीं पड़ता और कम ओवरहेड उत्पन्न करता है, इसलिए हम इसका उपयोग करते हैं।

enctype='multipart/form-data' अर्थ HTML फॉर्म में क्या है और हमें इसका उपयोग कब करना चाहिए?


आम तौर पर यह तब होता है जब आपके पास एक पोस्ट फॉर्म होता है जिसे डेटा के रूप में फ़ाइल अपलोड करने की आवश्यकता होती है ... यह सर्वर को बताएगा कि यह स्थानांतरित डेटा को कैसे एन्कोड करेगा, ऐसे मामले में यह एन्कोड नहीं किया जाएगा क्योंकि यह केवल स्थानांतरित और अपलोड होगा सर्वर पर फ़ाइलें, उदाहरण के लिए एक छवि या एक पीडीएफ अपलोड करते समय


जब आप कोई POST अनुरोध करते हैं, तो आपको उस डेटा को एन्कोड करना होगा जो अनुरोध के शरीर को किसी भी तरीके से बनाता है।

एचटीएमएल फॉर्म एन्कोडिंग के तीन तरीके प्रदान करते हैं।

  • application/x-www-form-urlencoded (डिफ़ॉल्ट)
  • multipart/form-data
  • text/plain

application/json जोड़ने पर काम किया जा रहा था, लेकिन इसे छोड़ दिया गया है।

प्रारूपों के विनिर्देश अधिकांश डेवलपर्स से कोई फर्क नहीं पड़ता। महत्वपूर्ण बिंदु हैं:

जब आप क्लाइंट-साइड कोड लिख रहे होते हैं, तो आपको अपने multipart/form-data का उपयोग करने की आवश्यकता होती है जब आपके फॉर्म में कोई भी <input type="file"> तत्व शामिल होता है

जब आप सर्वर-साइड कोड लिख रहे हैं: लाइब्रेरी के हैंडलिंग लाइब्रेरी (उदाहरण के लिए पर्ल का CGI->param या PHP के $_POST CGI->param द्वारा खुलासा किया गया) का उपयोग करें और यह आपके लिए मतभेदों का ख्याल रखेगा। सर्वर द्वारा प्राप्त कच्चे इनपुट को पार्स करने की कोशिश न करें।

text/plain का कभी भी उपयोग न करें।

यदि आप कच्चे डेटा को पार्सिंग या उत्पन्न करने के लिए लाइब्रेरी लिख रहे हैं (या डिबगिंग), तो आपको प्रारूप के बारे में चिंता करना शुरू करना होगा। आप इसके बारे में ब्याज के लिए भी जानना चाहेंगे।

यूआरएल के अंत में एक क्वेरी स्ट्रिंग के रूप में application/x-www-form-urlencoded उतना ही कम है।

multipart/form-data काफी जटिल है लेकिन यह multipart/form-data में पूरी फाइलों को शामिल करने की अनुमति देता है। परिणाम का एक उदाहरण HTML 4 विनिर्देशन में पाया जा सकता है।

text/plain 5 text/plain एचटीएमएल 5 द्वारा पेश किया गया है और केवल डीबगिंग के लिए उपयोगी है - spec से : वे कंप्यूटर द्वारा विश्वसनीय रूप से व्याख्या योग्य नहीं हैं - और मैं तर्क दूंगा कि अन्य टूल के साथ संयुक्त होते हैं (जैसे अधिकांश ब्राउज़रों के डेवलपर टूल में नेट टैब ) इसके लिए बेहतर हैं)।


विधि विशेषता को POST पर सेट करें क्योंकि फ़ाइल सामग्री को किसी फ़ॉर्म का उपयोग करके URL पैरामीटर के अंदर नहीं रखा जा सकता है।

Enctype के मान को मल्टीपार्ट / फॉर्म-डेटा पर सेट करें क्योंकि डेटा को कई हिस्सों में विभाजित किया जाएगा, प्रत्येक फ़ाइल के लिए एक और फॉर्म बॉडी के पाठ के लिए एक जिसे उनके साथ भेजा जा सकता है।


enctype='multipart/form-data एक एन्कोडिंग प्रकार है जो फ़ाइलों को POST के माध्यम से भेजने की अनुमति देता है। काफी आसानी से, इस एन्कोडिंग के बिना फ़ाइलों को POST के माध्यम से नहीं भेजा जा सकता है।

यदि आप किसी उपयोगकर्ता को किसी फ़ॉर्म के माध्यम से फ़ाइल अपलोड करने की अनुमति देना चाहते हैं, तो आपको इस एंटी टाइप का उपयोग करना होगा।


  • enctype ( ENC ode TYPE ) विशेषता निर्दिष्ट करती है कि सर्वर पर सबमिट करते समय फ़ॉर्म-डेटा को एन्कोड किया जाना चाहिए।
  • मल्टीपार्ट / फॉर्म-डेटा enctype विशेषता का मान है, जिसका उपयोग फॉर्म तत्व में किया जाता है जिसमें फ़ाइल अपलोड होता है। बहु-भाग का मतलब है कि फॉर्म डेटा कई हिस्सों में विभाजित होता है और सर्वर को भेजता है।
    • रूपक भाग : एक HTML दस्तावेज़ में दो भाग होते हैं : एक सिर और एक शरीर।




http-headers