जवाबों:
जब आप एक POST अनुरोध करते हैं, तो आपको उस डेटा को एनकोड करना होगा जो किसी तरह से अनुरोध का मुख्य भाग बनता है।
HTML फॉर्म एन्कोडिंग के तीन तरीके प्रदान करते हैं।
application/x-www-form-urlencoded
(डिफ़ॉल्ट)multipart/form-data
text/plain
जोड़ने पर काम चल रहा था application/json
, लेकिन उसे छोड़ दिया गया है।
(HTML फ़ॉर्म सबमिशन की तुलना में अन्य साधनों के उपयोग से उत्पन्न HTTP अनुरोधों के साथ अन्य एन्कोडिंग संभव है। JSON वेब सेवाओं के साथ उपयोग के लिए एक सामान्य प्रारूप है और कुछ अभी भी SOAP का उपयोग करते हैं।)
अधिकांश डेवलपर्स के लिए स्वरूपों की बारीकियां कोई मायने नहीं रखती हैं। महत्वपूर्ण बिंदु हैं:
text/plain
।जब आप क्लाइंट-साइड कोड लिख रहे हैं:
multipart/form-data
जब आपके फॉर्म में कोई <input type="file">
तत्व शामिल होंmultipart/form-data
या application/x-www-form-urlencoded
लेकिन application/x-www-form-urlencoded
और अधिक कुशल हो जाएगाजब आप सर्वर-साइड कोड लिख रहे हैं:
अधिकांश (जैसे पर्ल CGI->param
या PHP के $_POST
सुपरग्लोबल द्वारा उजागर किया गया ) आपके लिए मतभेदों का ध्यान रखेगा। सर्वर द्वारा प्राप्त कच्चे इनपुट को पार्स करने की कोशिश मत करो।
कभी-कभी आपको एक ऐसी लाइब्रेरी मिलेगी जो दोनों प्रारूपों को संभाल नहीं सकती है। प्रपत्र डेटा को संभालने के लिए Node.js की सबसे लोकप्रिय लाइब्रेरी बॉडी-पार्सर है जो मल्टीपार्ट अनुरोधों को संभाल नहीं सकती (लेकिन प्रलेखन है जो कुछ विकल्पों की सिफारिश करता है जो कर सकते हैं)।
यदि आप कच्चे डेटा को पार्स करने या जेनरेट करने के लिए लाइब्रेरी लिख रहे हैं (या डिबगिंग), तो आपको प्रारूप के बारे में चिंता करने की आवश्यकता है। आप इसके बारे में रुचि के लिए जानना चाह सकते हैं।
application/x-www-form-urlencoded
URL के अंत में क्वेरी स्ट्रिंग के समान ही है।
multipart/form-data
काफी अधिक जटिल है, लेकिन यह संपूर्ण फ़ाइलों को डेटा में शामिल करने की अनुमति देता है। परिणाम का एक उदाहरण HTML 4 विनिर्देश में पाया जा सकता है ।
text/plain
एचटीएमएल 5 द्वारा पेश किया गया है और केवल डिबगिंग के लिए उपयोगी है - युक्ति से : वे कंप्यूटर द्वारा विश्वसनीय रूप से व्याख्या करने योग्य नहीं हैं - और मैं तर्क दूंगा कि अन्य उपकरण के साथ संयुक्त (जैसे अधिकांश ब्राउज़रों के डेवलपर टूल में नेटवर्क पैनल ) बेहतर हैं उसके लिए)।
हमें इसका उपयोग कब करना चाहिए
क्वेंटिन का उत्तर सही है: multipart/form-data
यदि फ़ाइल में कोई फ़ाइल अपलोड है, और application/x-www-form-urlencoded
अन्यथा, जो चूक हो तो डिफ़ॉल्ट का उपयोग करें enctype
।
मैं जा रहा हूँ:
इसके लिए तीन संभावनाएँ हैं enctype
:
application/x-www-form-urlencoded
multipart/form-data
( RFC7578 से संबंधित बिंदु )text/plain
। यह "कंप्यूटर द्वारा विश्वसनीय रूप से व्याख्या योग्य नहीं है", इसलिए इसे कभी भी उत्पादन में उपयोग नहीं किया जाना चाहिए, और हम इसमें आगे नहीं देखेंगे।एक बार जब आप प्रत्येक विधि का एक उदाहरण देखते हैं, तो यह स्पष्ट हो जाता है कि वे कैसे काम करते हैं, और जब आपको प्रत्येक का उपयोग करना चाहिए।
आप उदाहरण का उपयोग कर उत्पादन कर सकते हैं:
nc -l
या एक ECHO सर्वर: GET / POST अनुरोध स्वीकार करने वाला HTTP टेस्ट सर्वरफॉर्म को एक न्यूनतम .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ω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ωb
है, जो साधन aωb
क्योंकि ω
है U+03C9
, जो बाइट्स हैं 61 CF 89 62
UTF-8 में।
अपलोड करने के लिए फ़ाइलें बनाएँ:
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
अपने ब्राउज़र पर HTML खोलें, फ़ाइलों का चयन करें और सबमिट पर क्लिक करें और टर्मिनल की जांच करें।
nc
प्राप्त अनुरोध को प्रिंट करता है।
पर परीक्षण किया गया: Ubuntu 14.04.3, nc
BSD 1.105, Firefox 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
( aωb
UTF-8 में) शाब्दिक रूप से भेजे जाते हैं। आप इसे सत्यापित कर सकते हैं nc -l localhost 8000 | hd
, जो कहता है कि बाइट्स:
61 CF 89 62
भेजे गए ( 61
== 'a' और 62
== 'b')।
इसलिए यह स्पष्ट है कि:
Content-Type: multipart/form-data; boundary=---------------------------735323031399963166993862150
सामग्री प्रकार सेट करता है multipart/form-data
और कहता है कि फ़ील्ड दिए गए boundary
स्ट्रिंग द्वारा अलग किए गए हैं ।
लेकिन ध्यान दें:
boundary=---------------------------735323031399963166993862150
--
वास्तविक अवरोध की तुलना में दो कम डैड्स हैं
-----------------------------735323031399963166993862150
ऐसा इसलिए है क्योंकि मानक को दो डैश के साथ शुरू करने के लिए सीमा की आवश्यकता होती है --
। अन्य डैश प्रतीत होता है कि फ़ायरफ़ॉक्स ने मनमानी सीमा को लागू करने के लिए कैसे चुना। RFC 7578 में स्पष्ट रूप से उल्लेख किया गया है कि उन दो प्रमुख डैश --
की आवश्यकता है:
4.1। मल्टीपार्ट / फॉर्म-डेटा का "सीमा" पैरामीटर
अन्य मल्टीपार्ट प्रकारों के साथ, भागों को सीमारेखा, "-", और "सीमा" पैरामीटर के मान से निर्मित सीमा परिसीमन के साथ सीमांकित किया जाता है।
प्रत्येक क्षेत्र को उसके डेटा से पहले कुछ उप शीर्षलेख मिलते हैं: Content-Disposition: form-data;
क्षेत्र name
, filename
डेटा के बाद।
सर्वर अगली सीमा स्ट्रिंग तक डेटा पढ़ता है। ब्राउज़र को एक सीमा चुननी चाहिए जो किसी भी क्षेत्र में दिखाई नहीं देगी, इसलिए यही कारण है कि सीमा अनुरोधों के बीच भिन्न हो सकती है।
क्योंकि हमारे पास अद्वितीय सीमा है, डेटा का कोई एन्कोडिंग आवश्यक नहीं है: बाइनरी डेटा को भेजा जाता है।
TODO: इष्टतम सीमा आकार ( log(N)
I bet) क्या है, और इसे खोजने वाले एल्गोरिथम का नाम / रनिंग टाइम क्या है? यहां से पूछा गया: /cs/39687/find-the-shortest-fterence-that-is-not-a-sub-fterence-of-a-set-of- आएंगे
Content-Type
ब्राउज़र द्वारा स्वचालित रूप से निर्धारित किया जाता है।
यह कैसे निर्धारित किया जाता है वास्तव में पूछा गया था: ब्राउज़र द्वारा अपलोड की गई फ़ाइल का माइम प्रकार कैसे है?
अब बदलने 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
, हम नहीं चाहेंगे, क्योंकि यह इतना अक्षम है।
लेकिन पाठ क्षेत्रों में पाए जाने वाले मुद्रण योग्य वर्णों के लिए, इससे कोई फर्क नहीं पड़ता है और कम ओवरहेड उत्पन्न करता है, इसलिए हम इसका उपयोग करते हैं।
%CF
3 बाइट्स लंबा है: %
, C
और F
:-) यह मानव पठनीय बनाने की कहानी।
nc
दोनों -l
और -p
तर्कों को एक साथ स्वीकार नहीं करेंगे । लेकिन यह मेरे लिए काम करता है while true; do printf '' | nc -l 8000; done
:।
Content-Type
दो हाइफ़न ( --
) में कम है, अर्थात जब वास्तव में संदेश बॉडी में सीमा का उपयोग करते हैं, तो आपको इसके साथ उपसर्ग करना होगा --
। इसके अलावा, अंतिम सीमा के साथ प्रत्यय होना चाहिए --
, लेकिन यह नोटिस करने के लिए काफी आसान है। देखें stackoverflow.com/questions/3508252/…
enctype='multipart/form-data
एक एन्कोडिंग प्रकार है जो फ़ाइलों को POST के माध्यम से भेजने की अनुमति देता है । काफी बस, इस कूटबन्धन के बिना फ़ाइलों को POST के माध्यम से नहीं भेजा जा सकता है ।
यदि आप किसी उपयोगकर्ता को किसी फ़ॉर्म के माध्यम से फ़ाइल अपलोड करने की अनुमति देना चाहते हैं, तो आपको इस enctype का उपयोग करना होगा ।
multipart/form-data
गैर-बाइनरी फ़ाइलों को भेजने के लिए उपयोग कर सकते हैं लेकिन यह अक्षम है। मेरा मानना application/x-www-form-urlencoded
है कि गैर-बाइनरी डेटा भेजने का सही तरीका है, लेकिन गैर-बाइनरी फ़ाइलों वाले अधिक अनुभव वाले किसी व्यक्ति को मुझे सही करने की आवश्यकता हो सकती है।
multipart/form-data
फ़ाइल भेजने के लिए उपयोग करने का मुख्य लाभ यह है कि यह फ्रंटएंड और बैकएंड दोनों में स्वचालित रूप से काम करेगा। आपको कोई विशेष कार्य करने की आवश्यकता नहीं है। सभी फाइलें बाइनरी हैं भले ही उन्हें केवल पाठ होना चाहिए। application/x-www-form-urlencoded
संलग्न फ़ाइलों के बिना एक फॉर्म को पोस्ट करने का मानक तरीका है। multipart/form-data
संलग्न फ़ाइल के साथ फ़ॉर्म को पोस्ट करने का मानक तरीका है। (कई अन्य एन्कोडिंग भी हैं, जैसे कि application/json
और application/json-patch+json
, जो सर्वर और क्लाइंट के बीच संचार के लिए आम हैं।)
multipart/form-data
। आप जो नहीं कर सकते, वह यह है कि जावास्क्रिप्ट के बिना, एक साधारण HTML फॉर्म सबमिशन का उपयोग करना। उपयोग करने के लिए एक फॉर्म सेट करना multipart/form-data
एकमात्र तंत्र है जो HTML आपको जावास्क्रिप्ट का उपयोग किए बिना POST फ़ाइलों को प्रदान करने के लिए प्रदान करता है। मुझे लगता है कि यह उत्तर में पर्याप्त स्पष्ट नहीं है, और एक भोले पाठक को लगता है कि बिना फ़ाइलों को भेजने में असमर्थता HTTP कीmultipart/form-data
सीमा है ; ऐसी बात नहीं है।
फ़ॉर्म सबमिट करते समय, आप अपने ब्राउज़र को HTTP प्रोटोकॉल, नेटवर्क पर एक संदेश, टीसीपी / आईपी प्रोटोकॉल संदेश संरचना में ठीक से ढके हुए भेजने के लिए कहते हैं। HTML पेज में सर्वर को डेटा भेजने का एक तरीका है: <form>
s का उपयोग करके ।
जब कोई फ़ॉर्म सबमिट किया जाता है, तो एक HTTP अनुरोध बनाया जाता है और सर्वर को भेजा जाता है, संदेश में प्रपत्र में फ़ील्ड नाम और उपयोगकर्ता द्वारा भरे गए मान होंगे। यह प्रसारण HTTPPOST
या GET
HTTP तरीकों से हो सकता है ।
POST
HTTP संदेश बनाने के लिए अपने ब्राउज़र को बताता है और संदेश के मुख्य भाग में सभी सामग्री डाल देता है (चीजों को करने का एक बहुत ही उपयोगी तरीका, अधिक सुरक्षित और लचीला भी)।GET
प्रपत्र डेटा को क्वेरिस्ट्रिंग में सबमिट करेगा । इसमें डेटा प्रतिनिधित्व और लंबाई के बारे में कुछ अड़चनें हैं।पद्धति enctype
का उपयोग करते समय गुण का ही अर्थ है POST
। जब निर्दिष्ट किया जाता है, तो यह एक विशिष्ट तरीके से सामग्री को एन्कोडिंग करके ब्राउज़र को भेजने का निर्देश देता है। से MDN - फार्म enctype :
जब विधि विशेषता का मान पोस्ट होता है, तो enctype MIME प्रकार की सामग्री है जो सर्वर को फ़ॉर्म सबमिट करने के लिए उपयोग की जाती है।
application/x-www-form-urlencoded
: यह डिफ़ॉल्ट है। जब फ़ॉर्म भेजा जाता है, तो सभी नाम और मान एकत्र किए जाते हैं और अंतिम एन्कॉर्डिंग पर URL एन्कोडिंग किया जाता है।multipart/form-data
: वर्ण एन्कोडेड नहीं हैं। यह महत्वपूर्ण है जब फॉर्म में फ़ाइल अपलोड नियंत्रण होता है। आप फ़ाइल को बाइनरी भेजना चाहते हैं और यह सुनिश्चित करता है कि बिटस्ट्रीम में कोई बदलाव नहीं किया गया है।text/plain
: रिक्त स्थान परिवर्तित हो जाते हैं, लेकिन अधिक एन्कोडिंग नहीं की जाती है।फॉर्म जमा करते समय, RFC 7578 धारा 7 में कहा गया है कि कुछ सुरक्षा चिंताएं उत्पन्न हो सकती हैं : डेटा को गुणा करें - सुरक्षा के विचार :
सभी फॉर्म-प्रोसेसिंग सॉफ्टवेयर को उपयोगकर्ता द्वारा आपूर्ति किए गए फॉर्म-डेटा
को संवेदनशीलता के साथ व्यवहार करना चाहिए , क्योंकि इसमें अक्सर गोपनीय या व्यक्तिगत रूप से
पहचान करने वाली जानकारी होती है। वेब ब्राउज़रों में "ऑटो-फिल" सुविधाओं के व्यापक उपयोग हैं;
अन्यथा अनजाने
कार्यों को पूरा करने के दौरान अनजाने में गोपनीय जानकारी भेजने के लिए उपयोगकर्ताओं को बरगलाया जा सकता है । मल्टीपार्ट / फॉर्म-डेटा
अखंडता की जांच करने, गोपनीयता सुनिश्चित करने, उपयोगकर्ता
भ्रम या अन्य सुरक्षा सुविधाओं से बचने के लिए किसी भी सुविधा की आपूर्ति नहीं करता है; उन चिंताओं को
फॉर्म भरने और फॉर्म-डेटा-इंटरप्रेटिंग अनुप्रयोगों द्वारा संबोधित किया जाना चाहिए ।प्रपत्र प्राप्त करने और उन्हें संसाधित करने वाले एप्लिकेशन को अनुरोध प्रपत्र-प्रसंस्करण साइट पर डेटा वापस भेजने के लिए सावधान नहीं होना चाहिए जिसे भेजने का इरादा नहीं था।
यह महत्वपूर्ण
है कि
प्राप्तकर्ता के फ़ाइल स्थान में फ़ाइलों को अनजाने में अधिलेखित न करने के लिए सामग्री-विवाद हेडर फ़ील्ड के फ़ाइल नाम की व्याख्या करते समय ।
यदि आप एक डेवलपर हैं और आपका सर्वर उपयोगकर्ताओं द्वारा सबमिट किए गए प्रपत्रों को संसाधित करेगा, जो संवेदनशील जानकारी वाले हो सकते हैं, तो यह चिंता करता है।
enctype
करते हैं। मुझे पता है कि यह शाब्दिक रूप से multipart/form-data
RFC से है, लेकिन फिर भी यह डेटा जमा करने के बारे में सुरक्षा कारणों की एक मनमानी डंप है जो डेटा के रूप में भेजा जाता है application/x-www-form-urlencoded
या नहीं, इसके लिए पूरी तरह से रूढ़िवादी हैं multipart/form-data
।
POST के लिए विधि विशेषता सेट करें क्योंकि फ़ाइल सामग्री को किसी प्रपत्र का उपयोग करके URL पैरामीटर के अंदर नहीं रखा जा सकता है।
मल्टीपार्ट / फॉर्म-डेटा के लिए एन्क्वाइट का मान सेट करें क्योंकि डेटा को कई भागों में विभाजित किया जाएगा, प्रत्येक फ़ाइल के लिए एक फॉर्म बॉडी के पाठ के लिए एक जिसे उनके साथ भेजा जा सकता है।
POST
किसी फ़ाइल को फ़ॉर्म के माध्यम से सबमिट करने के लिए पर्याप्त होने की संभावना है और यह जोड़ना multipart/form-data
कुछ अस्पष्ट तरीके से सिर्फ एक बोनस है। ऐसी बात नहीं है। अधिकांश फ़ाइलों का उपयोग करने की आवश्यकता होगी multipart/form-data
।
<head>
और <body>
अप्रासंगिक और भ्रामक है।
आमतौर पर यह तब होता है जब आपके पास एक POST फॉर्म होता है, जिसे डेटा के रूप में फ़ाइल अपलोड करने की आवश्यकता होती है ... यह सर्वर को बताएगा कि यह स्थानांतरित किए गए डेटा को कैसे एन्कोड करेगा, ऐसे में यह एन्कोडेड नहीं होगा क्योंकि यह सिर्फ ट्रांसफर और अपलोड होगा सर्वर पर फाइलें, उदाहरण के लिए, जब कोई छवि या पीडीएफ अपलोड कर रहा हो
एन्क्टाइप विशेषता निर्दिष्ट करती है कि सर्वर में सबमिट करते समय फॉर्म-डेटा को कैसे एनकोड किया जाना चाहिए।
एक्टाइप विशेषता का उपयोग केवल तभी किया जा सकता है यदि विधि = "पोस्ट"।
कोई वर्ण कूटबद्ध नहीं है। यह मान आवश्यक है जब आप उन रूपों का उपयोग कर रहे हैं जिनमें फ़ाइल अपलोड नियंत्रण है
से W3Schools
multipart/form-data
। यह भी बहुत अस्पष्ट है; वाक्य "कोई वर्ण कूटबद्ध नहीं होता" का क्या अर्थ है? -1।