मल्टीपार्ट / फॉर्म-डेटा में सीमा क्या है?


403

मैं के बारे में एक सवाल पूछना चाहता हूँ multipart/form-data। HTTP शीर्ष लेख में, मुझे लगता है कि लगता है Content-Type: multipart/form-data; boundary=???

क्या ???उपयोगकर्ता द्वारा परिभाषित किया जा सकता है? या यह HTML से उत्पन्न होता है? क्या मेरे लिए परिभाषित करना संभव है ??? = abcdefg?


2
मैंने पाया यह उत्तर है। w3.org/TR/html401/interact/forms.html#h-17.13.4.2
प्रश्न

जवाबों:


424

क्या ???उपयोगकर्ता द्वारा परिभाषित किया जा सकता है?

हाँ।

या यह HTML द्वारा आपूर्ति की जाती है

नहीं। HTML का इससे कोई लेना- देना नहीं है। नीचे दिया गया पढ़ें।

यह मेरे को परिभाषित करने के लिए संभव है ???के रूप में abcdefg?

हाँ।

यदि आप वेब सर्वर पर निम्न डेटा भेजना चाहते हैं:

name = John
age = 12

उपयोग application/x-www-form-urlencodedइस तरह होगा:

name=John&age=12

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

तो सर्वर को कैसे पता चलता है कि एक पैरामीटर मान शुरू होता है और समाप्त होता है जब यह एक HTTP अनुरोध का उपयोग करके प्राप्त करता है multipart/form-data?

सीमा का उपयोग करना , के समान &

उदाहरण के लिए:

--XXX
Content-Disposition: form-data; name="name"

John
--XXX
Content-Disposition: form-data; name="age"

12
--XXX--

उस मामले में, सीमा मूल्य है XXX। आप इसे Content-Typeहेडर में निर्दिष्ट करते हैं ताकि सर्वर जानता है कि उसे प्राप्त डेटा को कैसे विभाजित किया जाए।

तो आप की जरूरत है:

  • उस मान का उपयोग करें जो सर्वर पर भेजे गए HTTP डेटा में नहीं दिखाई देगा।

  • सुसंगत रहें और अनुरोध संदेश में हर जगह समान मूल्य का उपयोग करें।


54
सीमा के अंत में यॉट को एक अतिरिक्त "-" जोड़ना होगा।
सेबेस्टियन पिस्कोर्स्की

13
आप इसे प्रलेखन में पढ़ सकते हैं। सीमा समाप्त करने के लिए अतिरिक्त दो हाइपेन होने चाहिए "-" लिंक: w3.org/TR/html401/interact/forms.html#h-17.13.4.2
सेबस्टियन पिस्कोर्स्की

6
बहुत बढ़िया जवाब। एक सीमा एक मल्टीपल पेलोड के कई "भागों" को अलग करने के लिए सिर्फ 'कुंजी' है। आम तौर पर 'और' जैसी कोई चीज चर को अलग करने के लिए पर्याप्त होती है, लेकिन पेलोड के भीतर पेलोड को अलग करने के लिए आपको कुछ और अनोखा चाहिए होता है।
user2483724

1
@ K3rnel31 निश्चित रूप से, जब तक कि नई सीमा स्ट्रिंग की लंबाई समान नहीं होती।
ऑस्कर मेडेरोस

5
मुझे लगता है कि सामग्री-प्रकार के हेडर में घोषित सीमा मूल्य वास्तव में -XXX होगा --- क्योंकि एक अतिरिक्त "-" को भागों को अलग करते समय लिखा जाना चाहिए (इसलिए --- एक्सएक्सएक्स ---)
थियोडोर के। ।

96

प्रश्न का सटीक उत्तर है: हाँ, आप boundaryपैरामीटर के लिए एक मनमाना मूल्य का उपयोग कर सकते हैं , क्योंकि यह लंबाई में 70 बाइट्स से अधिक नहीं है और इसमें केवल 7-बिटUS-ASCII (प्रिंट करने योग्य) अक्षर हैं।

यदि आप किसी एक multipart/*सामग्री प्रकार का उपयोग कर रहे हैं , तो आपको वास्तव में हेडर में पैरामीटर निर्दिष्ट करना आवश्यक है , अन्यथा सर्वर (HTTP अनुरोध के मामले में) पेलोड को पार्स करने में सक्षम नहीं होगा।boundaryContent-Type

आप शायद अपने हेडर में charsetपैरामीटर सेट करना चाहते हैं , जब तक कि आप पूरी तरह से सुनिश्चित न हों कि पेलोड डेटा में केवल चारसेट का उपयोग किया जाएगा।UTF-8Content-TypeUS-ASCII

RFC2046 के कुछ प्रासंगिक अंश :

  • 4.1.2। चारसेट पैरामीटर:

    कुछ अन्य पैरामीटर मानों के विपरीत, चारसेट पैरामीटर के मान संवेदनशील नहीं होते हैं। डिफ़ॉल्ट वर्ण सेट, जिसे एक चार्ट पैरामीटर के अभाव में ग्रहण किया जाना चाहिए, US-ASCII है।

  • 5.1। मल्टीपार्ट मीडिया प्रकार

    जैसा कि सामग्री-अंतरण-एन्कोडिंग क्षेत्र [RFC 2045] की परिभाषा में कहा गया है, "7bit", "8bit" या "बाइनरी" के अलावा किसी भी एन्कोडिंग को "मल्टीपार्ट" प्रकार की संस्थाओं के लिए अनुमति नहीं है। "मल्टीपार्ट" सीमा परिसीमन और हेडर फ़ील्ड को हमेशा किसी भी मामले में 7bit यूएस-एएससीआईआई के रूप में दर्शाया जाता है (हालांकि हेडर फ़ील्ड गैर-यूएस-एएससीआईआई हेडर पाठ को आरएफसी 2047 के अनुसार एनकोड कर सकते हैं) और शरीर के हिस्सों के भीतर डेटा को एन्कोड किया जा सकता है। भाग-दर-भाग आधार, प्रत्येक उपयुक्त शरीर के हिस्से के लिए सामग्री-स्थानांतरण-एन्कोडिंग क्षेत्रों के साथ।

    मल्टीपार्ट संस्थाओं के लिए सामग्री-प्रकार फ़ील्ड के लिए एक पैरामीटर, "सीमा" की आवश्यकता होती है। सीमा परिसीमन रेखा को तब पूरी तरह से दो हाइफ़न वर्णों ("-", दशमलव मान 45) से युक्त एक पंक्ति के रूप में परिभाषित किया जाता है, जिसके बाद सामग्री-प्रकार हेडर फ़ील्ड, वैकल्पिक रैखिक व्हाट्सएप और एक टर्मिनेट डीआरएलएफ से सीमा पैरामीटर मान होता है।

    सीमा के परिसीमन को इनकैप्सुलेटेड सामग्री के भीतर प्रकट नहीं होना चाहिए, और 70 पात्रों से अधिक नहीं होना चाहिए, न कि दो प्रमुख हाइफ़न की गिनती करना।

    अंतिम शरीर के भाग के बाद सीमा परिसीमन रेखा एक विशिष्ट परिसीमन है जो इंगित करता है कि आगे के शरीर के अंगों का पालन नहीं किया जाएगा। ऐसी सीमांकक रेखा पिछले परिसीमन रेखाओं के समान है, सीमा पैरामीटर मान के बाद दो और हाइफ़न के अतिरिक्त।

यहाँ एक मनमाना सीमा का उपयोग करके एक उदाहरण दिया गया है:

Content-Type: multipart/form-data; charset=utf-8; boundary="another cool boundary"

--another cool boundary
Content-Disposition: form-data; name="foo"

bar
--another cool boundary
Content-Disposition: form-data; name="baz"

quux
--another cool boundary--

2
मुझे यह उत्तर सबसे अधिक पसंद है क्योंकि यह आरएफसी से उद्धृत करता है कि हाइफ़न कैसे निर्दिष्ट किए जाते हैं।
रिक

@ क्लिक करें IETF के लिए ऐसा करने का एक वैध कारण है - हालांकि वे सभी बहुत समान दिखते हैं, निम्नलिखित चार में से केवल एक ही सही हाइफ़न वर्ण है: - - -
antichris

हा, जब मैंने हाइपेंस कहा था, तो मेरा मतलब है कि आपके उत्तर ने मुझे बताया कि कौन से हाइपेन मानक में परिभाषित हैं। मैं उलझन में था कि कौन से सम्मोहन "ग्राहक परिभाषित" हैं और जो "विनिर्देश परिभाषित" हैं
रिक

31

बहुखण्डीय / फार्म डेटा शामिल हैं सीमा अलग नाम / मान युग्म के लिए। जब कोई प्रपत्र सबमिट किया जाता है तो सीमा नाम / मूल्य जोड़े के प्रत्येक भाग के एक मार्कर की तरह काम करती है। सीमा स्वचालित रूप से अनुरोध शीर्षक के सामग्री-प्रकार में जोड़ दी जाती है।

Enctype के साथ फ़ॉर्म = "मल्टीपार्ट / फ़ॉर्म-डेटा" विशेषता में एक अनुरोध हेडर होगा सामग्री-प्रकार: मल्टीपार्ट / फॉर्म-डेटा; सीमा --- WebKit193844043-h ( ब्राउज़र उत्पन्न vaue )।

पारित पेलोड कुछ इस तरह दिखता है:

Content-Type: multipart/form-data; boundary=---WebKitFormBoundary7MA4YWxkTrZu0gW

    -----WebKitFormBoundary7MA4YWxkTrZu0gW
    Content-Disposition: form-data; name=”file”; filename=”captcha
    Content-Type:

    -----WebKitFormBoundary7MA4YWxkTrZu0gW
    Content-Disposition: form-data; name=”action

    submit
    -----WebKitFormBoundary7MA4YWxkTrZu0gW--

वेबसर्विस साइड में, इसका उपयोग @ कॉन्स्यूम ("मल्टीपार्ट / फॉर्म-डेटा") फॉर्म में किया जाता है।

खबरदार, जब क्रोम पोस्टमैन का उपयोग करके अपने webservice का परीक्षण करते हैं, तो आपको अनुलग्नक भेजने के लिए ड्रॉपडाउन बॉक्स से प्रपत्र डेटा विकल्प (रेडियो बटन) और फ़ाइल मेनू की जांच करने की आवश्यकता है। मल्टीपार्ट / फॉर्म-डेटा के रूप में सामग्री-प्रकार का स्पष्ट प्रावधान एक त्रुटि फेंकता है। क्योंकि सीमा गायब है क्योंकि यह पोस्ट मैन के कर्ल अनुरोध को सीमा को जोड़कर सामग्री-प्रकार के साथ सर्वर से जुड़ता है जो ठीक काम करता है।

देखें RFC1341 sec7.2 मल्टीपार्ट सामग्री प्रकार

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