HTTP फ़ाइल कैसे काम करती है?


527

जब मैं संलग्न फ़ाइल के साथ इस तरह एक सरल रूप प्रस्तुत करता हूं:

<form enctype="multipart/form-data" action="http://localhost:3000/upload?upload_progress_id=12344" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="100000" />
Choose a file to upload: <input name="uploadedfile" type="file" /><br />
<input type="submit" value="Upload File" />
</form>

यह फ़ाइल को आंतरिक रूप से कैसे भेजता है? क्या फ़ाइल को HTTP बॉडी के हिस्से के रूप में डेटा के रूप में भेजा जाता है? इस अनुरोध के शीर्षलेखों में, मुझे फ़ाइल के नाम से संबंधित कुछ भी दिखाई नहीं देता है।

मैं सिर्फ फ़ाइल भेजते समय HTTP के आंतरिक कामकाज को जानना चाहूंगा।


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

... के रूप में सूँघने जाना, fiddler मेरी पसंद का हथियार है। तुम भी कैसे वे पोस्ट देखने के लिए अपने स्वयं के परीक्षण अनुरोध बना सकते हैं।
फिल कूपर

दिलचस्पी रखने वालों के लिए, " MAX_FILE_SIZEPHP में - क्या बात है" stackoverflow.com/q/1381364/632951
Pacerier

मुझे MAX_FILE_SIZE अजीब लगता है। जैसा कि मैं पोस्ट करने से पहले अपने html को क्रोम में 100000000 में संशोधित कर सकता हूं ताकि यह एक बेहतर मूल्य पोस्ट करे। या तो 1. इसे एक सुरक्षित हैश में नमक के माध्यम से कुकी के साथ पकाया जाता है ताकि कुकी को संशोधित किया जा सके, सर्वर को अपवाद और फेंक सकता है (जैसे कि वेबपीस या प्लेफ्रामवर्क दोनों करते हैं) या कुछ प्रकार की फॉर्म मान्यता जो चीजें नहीं बदली हैं। @ 0xSina
डीन हिलर

जवाबों:


320

आइए एक नज़र डालते हैं कि क्या होता है जब आप एक फ़ाइल का चयन करते हैं और अपना फॉर्म जमा करते हैं (मैंने संक्षिप्तता के लिए हेडर को छोटा कर दिया है):

POST /upload?upload_progress_id=12344 HTTP/1.1
Host: localhost:3000
Content-Length: 1325
Origin: http://localhost:3000
... other headers ...
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryePkpFF7tjBAqx29L

------WebKitFormBoundaryePkpFF7tjBAqx29L
Content-Disposition: form-data; name="MAX_FILE_SIZE"

100000
------WebKitFormBoundaryePkpFF7tjBAqx29L
Content-Disposition: form-data; name="uploadedfile"; filename="hello.o"
Content-Type: application/x-object

... contents of file goes here ...
------WebKitFormBoundaryePkpFF7tjBAqx29L--

ध्यान दें: प्रत्येक सीमा स्ट्रिंग को अतिरिक्त के साथ उपसर्ग किया जाना चाहिए --, जैसे कि अंतिम सीमा स्ट्रिंग के अंत में। ऊपर दिए गए उदाहरण में यह पहले से ही शामिल है, लेकिन इसे याद रखना आसान हो सकता है। नीचे @Andreas द्वारा टिप्पणी देखें।

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

ऊपर दिए गए उदाहरण में, आप इनपुट MAX_FILE_SIZEको फॉर्म में सेट मूल्य के साथ देख सकते हैं , साथ ही फाइल डेटा वाले सेक्शन को भी देख सकते हैं । फ़ाइल का नाम Content-Dispositionहैडर का हिस्सा है ।

पूरा विवरण यहां है


7
@ source.rar: नहीं। वेबसर्वर्स (लगभग?) हमेशा थ्रेडेड होते हैं ताकि वे समवर्ती कनेक्शन को संभाल सकें। अनिवार्य रूप से, पोर्ट 80 पर सुनने वाली डेमन प्रक्रिया दूसरे थ्रेड / प्रक्रिया को परोसने के कार्य को तुरंत रोक देती है ताकि वह दूसरे कनेक्शन के लिए सुनने में वापस आ सके; यहां तक ​​कि अगर दो आने वाले कनेक्शन एक ही क्षण में आते हैं, तो वे नेटवर्क बफर में तब तक बैठेंगे जब तक कि डेमन उन्हें पढ़ने के लिए तैयार नहीं हो जाता।
अर्ग्यल

10
थ्रेडिंग स्पष्टीकरण थोड़ा गलत है क्योंकि उच्च प्रदर्शन सर्वर हैं जिन्हें सिंगल थ्रेडेड के रूप में डिज़ाइन किया गया है और कनेक्शन से डेटा के डाउनलोडिंग पैकेट को जल्दी से लेने के लिए एक स्टेट मशीन का उपयोग करते हैं। बल्कि, टीसीपी / आईपी में, पोर्ट 80 एक श्रवण पोर्ट है, न कि उस पोर्ट पर जिसका डेटा ट्रांसफर किया जाता है।
स्लीपबेटमैन

9
जब एक आईपी सुनने वाला सॉकेट (पोर्ट 80) एक कनेक्शन प्राप्त करता है तो एक और सॉकेट दूसरे पोर्ट पर बनाया जाता है, आमतौर पर 1000 से ऊपर एक यादृच्छिक संख्या के साथ। यह सॉकेट तब नए कनेक्शन के लिए सुनने के लिए पोर्ट 80 को छोड़कर स्वतंत्र सॉकेट से जुड़ा होता है।
स्लीपबेटमैन

11
@slebetman सबसे पहले, यह HTTP के बारे में है। एफ़टीपी सक्रिय मोड यहां लागू नहीं होता है। दूसरा, सुनने वाला सॉकेट हर कनेक्शन पर अवरुद्ध नहीं होता है। आपके पास एक पोर्ट के अधिक से अधिक कनेक्शन हो सकते हैं, क्योंकि अन्य पक्षों के पास अपने स्वयं के अंत को बांधने के लिए पोर्ट हैं।
स्लोटोस 20

33
ध्यान दें कि सामग्री-प्रकार के हेडर फ़ील्ड के भाग के रूप में पारित होने वाली सीमा स्ट्रिंग नीचे दिए गए अलग-अलग लोगों के लिए सीमा तारों की तुलना में 2 वर्ण कम है। मैंने अभी यह जानने की कोशिश में एक घंटा बिताया है कि मेरा अपलोडर काम क्यों नहीं करता है क्योंकि यह नोटिस करना काफी कठिन है कि वास्तव में पहली सीमा स्ट्रिंग में केवल 4 डैश हैं लेकिन अन्य सीमा तारों में 6 डैश हैं। दूसरे शब्दों में: व्यक्तिगत फॉर्म डेटा को अलग करने के लिए सीमा स्ट्रिंग का उपयोग करते समय, इसे दो डैश द्वारा उपसर्ग करना पड़ता है: - यह RFC1867 में वर्णित है, लेकिन मुझे लगता है कि इसे यहां भी बताया जाना चाहिए
एंड्रियास

279

यह फ़ाइल को आंतरिक रूप से कैसे भेजता है?

प्रारूप को कहा जाता है multipart/form-data, जैसा कि पूछा गया: enctype = 'multipart / form-data' का क्या अर्थ है?

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

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

HTML5 संदर्भ

इसके लिए तीन संभावनाएँ हैं enctype:

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

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

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

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

फॉर्म को एक न्यूनतम .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, जो बाइट्स हैं 61 CF 89 62UTF-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, ncBSD 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ωbUTF-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 ब्राउज़र द्वारा स्वचालित रूप से निर्धारित किया जाता है।

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

आवेदन / 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, हम नहीं चाहेंगे, क्योंकि यह इतना अक्षम है।

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


1
आप द्विआधारी लगाव कैसे जोड़ेंगे? (अर्थात एक छोटी छवि) - मैं विशेषताओं Content-Dispositionऔर Content-Typeविशेषताओं के लिए मूल्यों को बदलते हुए देख सकता हूं लेकिन 'सामग्री' को कैसे संभाल सकता हूं ?
20

3
@ianbeks ब्राउज़र अनुरोध भेजने से पहले स्वचालित रूप से करता है। मुझे नहीं पता कि यह कौन से उत्तराधिकार का उपयोग करता है, लेकिन सबसे अधिक संभावना है कि फ़ाइल एक्सटेंशन उनके बीच है। यह प्रश्न का उत्तर दे सकता है: stackoverflow.com/questions/1201945/…
Ciro Santilli 郝海东::::

3
@CiroSantilli 六四 事件 纳米比亚 ill ill answer answer मुझे लगता है कि यह उत्तर चुने हुए से बेहतर है। लेकिन कृपया अपनी प्रोफ़ाइल से अप्रासंगिक सामग्री को हटा दें। यह एसओ की भावना के खिलाफ है।
smwikipedia

2
rsmc उद्धरण के लिए @smwikipedia धन्यवाद और इस उत्तर को पसंद करने के लिए! उपयोगकर्ता नाम के बारे में: मेरे लिए, SO की भावना यह है कि हर किसी को हर समय सबसे अच्छी जानकारी होनी चाहिए। ~~ इस चर्चा को ट्विटर या मेटा पर रखें। शांति।
सिरो सेंटिल्ली 郝海东 i i i

1
@Kumar हर्ष मुझे लगता है कि जवाब देने के लिए पर्याप्त विवरण नहीं है। कृपया एक नया सुपर विस्तृत प्रश्न खोलें।
सिरो सेंटिल्ली 郝海东 冠状 i i

62

फाइल को बाइनरी कंटेंट के रूप में भेजें (फॉर्म या फॉर्म के बिना अपलोड करें)

दिए गए उत्तरों / उदाहरणों में फ़ाइल एक HTML फॉर्म के साथ या फॉर्मडैट एपीआई का उपयोग करके अपलोड की गई (सबसे अधिक संभावना है) है । फ़ाइल अनुरोध में भेजे गए डेटा का केवल एक हिस्सा है, इसलिए multipart/form-data Content-Typeहेडर।

यदि आप फ़ाइल को एकमात्र सामग्री के रूप में भेजना चाहते हैं तो आप इसे सीधे अनुरोध निकाय के रूप में जोड़ सकते हैं और आप Content-Typeहेडर को उस फ़ाइल के MIME प्रकार पर सेट कर सकते हैं जिसे आप भेज रहे हैं। Content-Dispositionहेडर में फ़ाइल का नाम जोड़ा जा सकता है । आप इस तरह अपलोड कर सकते हैं:

var xmlHttpRequest = new XMLHttpRequest();

var file = ...file handle...
var fileName = ...file name...
var target = ...target...
var mimeType = ...mime type...

xmlHttpRequest.open('POST', target, true);
xmlHttpRequest.setRequestHeader('Content-Type', mimeType);
xmlHttpRequest.setRequestHeader('Content-Disposition', 'attachment; filename="' + fileName + '"');
xmlHttpRequest.send(file);

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


कैसे आप Asp.Net 4.0 के साथ इस के लिए एक सर्वर साइड सेवा कॉन्फ़िगर करूँ? क्या यह कई इनपुट पैरामीटर्स जैसे कि यूजरआईड, पाथ, कैप्शनटैक्स्ट आदि को हैंडल करेगा?
असले जी

1
@AsleG नहीं, यह केवल आपके अनुरोध की सामग्री के रूप में एक फ़ाइल भेजने के लिए है। मैं एक Asp.Net विशेषज्ञ नहीं हूं, लेकिन आपको बस अनुरोध से सामग्री (एक बूँद) को बाहर निकालना चाहिए और इसे Content-Typeहेडर से उपयोग करके फ़ाइल में सहेजना चाहिए ।
विल्ट

@AsleG शायद यह लिंक मदद कर सकता है
विल्ट

@wilt अगर मैं फॉर्म का उपयोग नहीं करता हूं, लेकिन मैं फॉर्मडेटा एपीआई का उपयोग करना चाहता हूं, तो क्या मैं इसे इस तरह से कर सकता हूं?
क्रोधित कीवी

1
@AnkitKhettry लगता है कि यह किसी प्रपत्र के साथ या प्रपत्र API का उपयोग करके अपलोड किया गया है। ये 'अजीब तार' आप संदर्भित करते हैं कि फॉर्म की सीमाएं आम तौर पर सर्वर पर भागों में फॉर्म डेटा को अलग करने के लिए उपयोग की जाती हैं।
विल्ट

9

मेरे पास यह नमूना जावा कोड है:

import java.io.*;
import java.net.*;
import java.nio.charset.StandardCharsets;

public class TestClass {
    public static void main(String[] args) throws IOException {
        ServerSocket socket = new ServerSocket(8081);
        Socket accept = socket.accept();
        InputStream inputStream = accept.getInputStream();

        InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
        char readChar;
        while ((readChar = (char) inputStreamReader.read()) != -1) {
            System.out.print(readChar);
        }

        inputStream.close();
        accept.close();
        System.exit(1);
    }
}

और मेरे पास यह test.html फ़ाइल है:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>File Upload!</title>
</head>
<body>
<form method="post" action="http://localhost:8081" enctype="multipart/form-data">
    <input type="file" name="file" id="file">
    <input type="submit">
</form>
</body>
</html>

और अंत में मैं परीक्षण प्रयोजनों के लिए उपयोग किया जाएगा फ़ाइल, a.dat नाम निम्नलिखित सामग्री है:

0x39 0x69 0x65

यदि आप ASCII या UTF-8 पात्रों के रूप में ऊपर बाइट्स की व्याख्या करते हैं, तो वे वास्तव में प्रतिनिधित्व करेंगे:

9ie

तो चलो हमारे जावा कोड को चलाएं, हमारे पसंदीदा ब्राउज़र में test.html खोलें , a.datफ़ॉर्म अपलोड करें और सबमिट करें और देखें कि हमारा सर्वर क्या प्राप्त करता है:

POST / HTTP/1.1
Host: localhost:8081
Connection: keep-alive
Content-Length: 196
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: null
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary06f6g54NVbSieT6y
DNT: 1
Accept-Encoding: gzip, deflate
Accept-Language: en,en-US;q=0.8,tr;q=0.6
Cookie: JSESSIONID=27D0A0637A0449CF65B3CB20F40048AF

------WebKitFormBoundary06f6g54NVbSieT6y
Content-Disposition: form-data; name="file"; filename="a.dat"
Content-Type: application/octet-stream

9ie
------WebKitFormBoundary06f6g54NVbSieT6y--

वैसे मैं पात्रों को 9 आई देखकर हैरान नहीं हूं क्योंकि हमने जावा से कहा था कि वे उन्हें यूटीएफ -8 के पात्रों के रूप में छापें। आप उन्हें कच्चे बाइट्स के रूप में पढ़ने के लिए चुन सकते हैं ..

Cookie: JSESSIONID=27D0A0637A0449CF65B3CB20F40048AF 

वास्तव में यहाँ अंतिम HTTP हैडर है। उसके बाद HTTP बॉडी आती है, जहाँ मेटा और हमारे द्वारा अपलोड की गई फाइल की सामग्री को वास्तव में देखा जा सकता है।


6

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

http://www.tutorialspoint.com/http/http_messages.htm

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