दिलचस्प पोस्ट
सरणी की सूची को एक बहुआयामी सरणी में कनवर्ट कैसे करें App.config में सेवा इंजेक्ट करें HTTP POST मल्टीपार्ट / फॉर्म-डेटा के साथ फाइल को कैसे अपलोड करें gradle – निर्भरता में पुस्तकालय डुप्लिकेट सी ++ में एक सार वर्ग के लिए मुझे एक वर्चुअल डिस्ट्रक्टर घोषित क्यों करना चाहिए? C ++ वर्चुअल फ़ंक्शन रिटर्न टाइप स्तंभों में पाई चार्ट के लिए किंवदंती कैसे प्रदर्शित करें? क्या एमएसटीईस्ट एनयूएनआईटी के टेस्टसीज़ के बराबर है? मैं बैकबोन में एक मॉडल कैसे ला सकता हूं? कैसे सी # में एक और प्रक्रिया के कमांड लाइन तर्क पढ़ने के लिए? मैं एक कन्स्ट्रक्टर या फ़ंक्शन के लिए एक अनूठे_पीट तर्क कैसे पारित करूं? 'है' ऑपरेटर अनपेक्षित रूप से गैर-कैश्ड इंटिजर्स के साथ व्यवहार करता है PHP पृष्ठ पुनर्निर्देशित एंजरीजेएस के एक तर्क कैसे प्राप्त करें "तर्क 'माइक्रोसनल' एक समारोह नहीं है, अपरिभाषित हो गया" एनएसयूआरआर एक पैरामीटर स्ट्रिंग में एक कुंजी के लिए एक सिंगल वेल्यू खींचता है

क्या एन्क्टीप = 'मल्टीपार्ट / फॉर्म-डेटा' का मतलब है?

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

वेब के समाधान से एकत्रित समाधान "क्या एन्क्टीप = 'मल्टीपार्ट / फॉर्म-डेटा' का मतलब है?"

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

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

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

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

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

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

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

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


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

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

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

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

हमें इसका उपयोग कब करना चाहिए

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

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

  • कुछ और HTML5 संदर्भ जोड़ें
  • समझाएं कि फॉर्म के साथ क्यों वह सही है उदाहरण प्रस्तुत करें

HTML5 संदर्भ

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

  • x-www-urlencoded
  • multipart/form-data (स्पेस पॉइंट टू आरएफसी 2388 )
  • 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 क्योंकि aωb U+03C9 , जो यूटीएफ -8 में 61 CF 89 62 बाइट 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 प्रिंट प्राप्त अनुरोध प्रिंट करता है

पर परीक्षण: Ubuntu 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 कंटेंट प्रकार को 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-f- परिणाम

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

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

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

अब application/x-www-form-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 साथ फाइल भेज सकें, तो हम ऐसा नहीं करना चाहते, क्योंकि यह इतना अक्षम है।

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

एक फ़ॉर्म सबमिट करते समय, आप अपने ब्राउज़र को HTTP प्रोटोकॉल के जरिए भेजने की कोशिश कर रहे हैं, जो कि एक टीसीपी / आईपी प्रोटोकॉल संदेश संरचना में ठीक से छिपे हुए नेटवर्क पर एक संदेश है। डेटा भेजते समय, आप HTTP प्रोटोकॉल का उपयोग करके डेटा भेजने के लिए POST या GET विधियां उपयोग कर सकते हैं। POST आपके ब्राउज़र को एक HTTP संदेश बनाने और संदेश के शरीर में सभी सामग्री को डालता है (चीजें, अधिक सुरक्षित और लचीला भी करने का एक बहुत ही उपयोगी तरीका)। डेटा के प्रतिनिधित्व और लंबाई के बारे में कुछ बाधाएं हैं।

बताते हुए कि आप क्या भेजते हैं

जब कोई फाइल भेजते हैं, तो HTTP प्रोटोकॉल को बताने के लिए आवश्यक है कि आप उसमें कई विशेषताओं और जानकारी रखने वाली फ़ाइल भेज रहे हैं। इस तरह से यह लगातार प्राप्तकर्ता को डेटा भेजना संभव है और इसे फ़ाइल को वर्तमान स्वरूप के साथ खोलें और इसी तरह … यह यहां दिखाया गया है कि HTTP प्रोटोकॉल से यह एक आवश्यकता है

आप डिफॉल्ट enctype पैरामीटर का उपयोग करके फाइल नहीं भेज सकते क्योंकि आपके रिसीवर को इसे पढ़ने में कोई समस्या आ सकती है (विचार करें कि कोई विशेष ऑपरेटिंग सिस्टम के लिए कुछ डेटा के लिए एक फाइल एक डिस्क्रिप्टर है, अगर आप इस तरह से चीजें देखते हैं, तो आप समझेंगे कि ऐसा क्यों महत्वपूर्ण है फ़ाइलों के लिए एक अलग enctype निर्दिष्ट करने के लिए)

सुरक्षा मत भूलना

काम करने का यह तरीका यह भी सुनिश्चित करता है कि कुछ सुरक्षा एल्गोरिदम आपके संदेशों पर काम करते हैं। बाहरी डेटा के लिए अच्छी फायरवॉल के रूप में कार्य करने के लिए यह जानकारी एप्लिकेशन-स्तरीय रूटर द्वारा भी उपयोग की जाती है।

ठीक है, जैसा कि आप देख सकते हैं, यह फाइल के लिए एक विशिष्ट enctype का उपयोग करते हुए एक बेवकूफी बात नहीं है

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

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

enctype='multipart/form-data' अर्थ है कि कोई भी अक्षर एन्कोडेड नहीं होगा। इसलिए सर्वर पर फाइल अपलोड करते समय इस प्रकार का उपयोग किया जाता है।
तो multipart/form-data का उपयोग तब किया जाता है जब किसी फ़ॉर्म को बायनेरी डेटा की आवश्यकता होती है, जैसे फाइल की सामग्री अपलोड करने के लिए

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

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

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

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