การอัพโหลดไฟล์ HTTP ทำงานอย่างไร


528

เมื่อฉันส่งแบบฟอร์มอย่างง่ายพร้อมไฟล์แนบ:

<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 เมื่อส่งไฟล์


ฉันไม่ได้ใช้ดมกลิ่นในขณะที่ แต่ถ้าคุณต้องการที่จะเห็นสิ่งที่ถูกส่งในคำขอของคุณ (เพราะมันเป็นเซิร์ฟเวอร์มันเป็นคำขอ) ดมกลิ่นมัน คำถามนี้กว้างเกินไป ดังนั้นจึงมีมากขึ้นสำหรับคำถามการเขียนโปรแกรมเฉพาะ
paparazzo

... เมื่อคนดมกลิ่นไปแล้วพู้ทำเล่นเป็นอาวุธที่ฉันเลือก คุณสามารถสร้างคำขอทดสอบของคุณเองเพื่อดูว่าพวกเขาโพสต์อย่างไร
Phil Cooper

สำหรับผู้ที่สนใจโปรดดู " MAX_FILE_SIZEใน PHP - ประเด็นคืออะไร" บนstackoverflow.com/q/1381364/632951
Pacerier

ฉันพบว่า MAX_FILE_SIZE แปลก ตามที่ฉันสามารถแก้ไข html ของฉันใน chrome เป็น 100000000 ก่อนโพสต์เพื่อให้โพสต์ค่าที่ดีกว่า 1. มีไว้ในคุกกี้ที่มีแฮชที่ปลอดภัยผ่านเกลือดังนั้นหากมีการแก้ไขเซิร์ฟเวอร์สามารถตรวจสอบและโยนข้อยกเว้น (เช่น webpieces หรือ playframework ทั้งสอง) หรือการตรวจสอบรูปแบบบางอย่างที่สิ่งต่าง ๆ ไม่ได้เปลี่ยนแปลง @ 0xSina
Dean Hiller

คำตอบ:


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: ไม่มีเว็บเซิร์ฟเวอร์ (เกือบ?) เธรดเสมอเพื่อให้สามารถจัดการการเชื่อมต่อพร้อมกันได้ โดยพื้นฐานแล้วกระบวนการ daemon ที่รับฟังพอร์ต 80 จะส่งงานให้บริการไปยังเธรด / กระบวนการอื่นทันทีเพื่อให้สามารถกลับไปฟังการเชื่อมต่ออื่นได้ แม้ว่าการเชื่อมต่อขาเข้าสองรายการจะมาถึงในเวลาเดียวกันพวกเขาจะนั่งในบัฟเฟอร์เครือข่ายจนกว่า daemon จะพร้อมอ่าน
eggyal

10
คำอธิบายการเธรดนั้นไม่ถูกต้องเนื่องจากมีเซิร์ฟเวอร์ประสิทธิภาพสูงที่ได้รับการออกแบบเป็นเธรดเดี่ยวและใช้เครื่องสถานะเพื่อเปลี่ยนการดาวน์โหลดแพ็กเก็ตข้อมูลจากการเชื่อมต่ออย่างรวดเร็ว แต่ใน TCP / IP พอร์ต 80 เป็นพอร์ตที่รับฟังไม่ใช่พอร์ตที่ถ่ายโอนข้อมูล
slebetman

9
เมื่อซ็อกเก็ตการฟัง IP (พอร์ต 80) ได้รับการเชื่อมต่อซ็อกเก็ตอื่นจะถูกสร้างขึ้นบนพอร์ตอื่นโดยทั่วไปจะมีหมายเลขสุ่มด้านบน 1,000 จากนั้นซ็อกเก็ตนี้จะเชื่อมต่อกับซ็อกเก็ตระยะไกล
slebetman

11
@slebetman ก่อนอื่นนี่เป็นเรื่องเกี่ยวกับ HTTP ใช้งานโหมด FTP ไม่ได้ที่นี่ ข้อสองซ็อกเก็ตการฟังจะไม่ถูกบล็อกในทุกการเชื่อมต่อ คุณสามารถเชื่อมต่อกับพอร์ตหนึ่งพอร์ตได้มากพอ ๆ
Slotos

33
โปรดทราบว่าสตริงขอบเขตที่ส่งผ่านเป็นส่วนหนึ่งของฟิลด์ส่วนหัวของเนื้อหาประเภทคือ 2 ตัวอักษรสั้นกว่าสตริงขอบเขตสำหรับแต่ละส่วนด้านล่าง ฉันเพิ่งใช้เวลาหนึ่งชั่วโมงเพื่อหาสาเหตุที่ผู้อัปโหลดของฉันไม่ทำงานเพราะมันค่อนข้างยากที่จะสังเกตเห็นว่าจริง ๆ แล้วมีเครื่องหมายขีดคั่นเพียง 4 ขีดในสายอักขระแรก แต่มี 6 ขีดกลางในอีกขอบเขต กล่าวอีกนัยหนึ่ง: เมื่อใช้สตริงขอบเขตเพื่อแยกข้อมูลแบบฟอร์มแต่ละรายการจะต้องมีการขึ้นต้นด้วยสองขีดกลาง: - มันอธิบายไว้ใน RFC1867 แน่นอน แต่ฉันคิดว่ามันควรจะชี้ให้เห็นที่นี่ด้วย
Andreas

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 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

เรียกใช้เซิร์ฟเวอร์ echo เล็ก ๆ ของเรา:

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

เปิด HTML บนเบราว์เซอร์ของคุณเลือกไฟล์และคลิกที่ส่งและตรวจสอบเทอร์มินัล

nc พิมพ์คำขอที่ได้รับ

ทดสอบกับ: Ubuntu 14.04.3, ncBSD 1.105, Firefox 40

multipart / form ข้อมูล

ส่ง Firefox แล้ว:

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
    

    มีสอง dadhes น้อย--กว่าอุปสรรคที่เกิดขึ้นจริง

    -----------------------------735323031399963166993862150
    

    --เพราะนี่คือมาตรฐานต้องมีขอบเขตที่จะเริ่มต้นด้วยการขีดสองขีด เครื่องหมายขีดคั่นอื่น ๆ ดูเหมือนจะเป็นเพียงวิธีที่ Firefox เลือกใช้ขอบเขตโดยพลการ RFC 7578 ระบุอย่างชัดเจนว่า--จำเป็นต้องมีขีดกลางสองอันดังกล่าว:

    4.1 "ขอบเขต" พารามิเตอร์ของหลายส่วน / แบบฟอร์มข้อมูล

    เช่นเดียวกับชนิดหลายส่วนอื่น ๆ ชิ้นส่วนจะถูกคั่นด้วยตัวคั่นขอบเขตสร้างโดยใช้ CRLF, "-" และค่าของพารามิเตอร์ "ขอบเขต"

  • ทุกสาขาจะได้รับส่วนหัวย่อยบางอย่างก่อนที่ข้อมูลที่: Content-Disposition: form-data;สนามnameที่filenameตามด้วยข้อมูล

    เซิร์ฟเวอร์อ่านข้อมูลจนกว่าจะถึงขอบเขตของสตริงถัดไป เบราว์เซอร์จะต้องเลือกขอบเขตที่จะไม่ปรากฏในฟิลด์ใด ๆ ดังนั้นนี่คือสาเหตุที่ขอบเขตอาจแตกต่างกันระหว่างคำขอ

    เนื่องจากเรามีขอบเขตที่ไม่ซ้ำกันจึงไม่จำเป็นต้องเข้ารหัสข้อมูล: ส่งข้อมูลไบนารีตามที่เป็นอยู่

    สิ่งที่ต้องทำ: ขนาดขอบเขตที่เหมาะสมที่สุด ( log(N)ฉันเดิมพัน) คืออะไรและชื่อ / เวลาทำงานของอัลกอริทึมที่พบมันคืออะไร ถามได้ที่: /cs/39687/find-the-shortest-sequence-that-is-not-a-s--ub-sequent-of-a-set-of-sequences

  • Content-Type ถูกกำหนดโดยเบราว์เซอร์โดยอัตโนมัติ

    มันถูกกำหนดอย่างไรถูกถามอย่างถูกต้องที่: ประเภทไฟล์ mime ที่อัพโหลดโดยเบราว์เซอร์เป็นอย่างไร?

แอพลิเคชัน / x-www ฟอร์ม urlencoded

ตอนนี้เปลี่ยนenctypeไปapplication/x-www-form-urlencodedโหลดเบราว์เซอร์และส่งอีกครั้ง

ส่ง Firefox แล้ว:

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คุณลักษณะ แต่จะจัดการ 'เนื้อหา' ได้อย่างไร
blurfus

3
@ianbeks เบราว์เซอร์จะทำงานโดยอัตโนมัติก่อนที่จะส่งคำขอ ฉันไม่รู้ว่าใช้ฮิวริสติกแบบใด แต่ส่วนใหญ่แล้วไฟล์นามสกุลอยู่ในหมู่พวกเขา นี่อาจตอบคำถาม: stackoverflow.com/questions/1201945/…
Ciro Santilli 法轮功冠状病病六四事件法轮功

3
@CiroSantilli 六四事件法轮功纳米比亚威视ฉันคิดว่าคำตอบนี้ดีกว่าคำตอบที่เลือก แต่โปรดลบเนื้อหาที่ไม่เกี่ยวข้องออกจากโปรไฟล์ของคุณ มันขัดต่อจิตวิญญาณของ SO
smwikipedia

2
@smwikipedia ขอบคุณสำหรับใบเสนอราคา rfc และสำหรับความชอบคำตอบนี้! เกี่ยวกับชื่อผู้ใช้: สำหรับฉันวิญญาณของ SO คือทุกคนควรมีข้อมูลที่ดีที่สุดตลอดเวลา ~~ เรามาพูดคุยเรื่องนี้กันใน twitter หรือ meta สันติภาพ.
Ciro Santilli 郝海东冠状病六四事件法轮功

1
@ Kumar ไม่ดีพอที่จะตอบรายละเอียดฉันคิดว่า โปรดเปิดคำถามใหม่โดยละเอียด
Ciro Santilli 法轮功冠状病六四事件法轮功

62

ส่งไฟล์เป็นเนื้อหาไบนารี (อัปโหลดโดยไม่มีฟอร์มหรือ FormData)

ในคำตอบ / ตัวอย่างที่กำหนดไฟล์จะถูกอัปโหลดด้วยแบบฟอร์ม HTML หรือใช้ FormData API ไฟล์เป็นเพียงส่วนหนึ่งของข้อมูลที่ส่งในคำขอดังนั้น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 ได้อย่างไร มันจะจัดการพารามิเตอร์อินพุตหลายรายการเช่นกันเช่น userId, path, captionText และอื่น ๆ ?
Asle G

1
@ AsleG Nope เป็นเพียงการส่งไฟล์เดียวเป็นเนื้อหาของคำขอของคุณ ฉันไม่ใช่ผู้เชี่ยวชาญ Asp.Net แต่คุณควรดึงเนื้อหา (blob) ออกจากคำขอและบันทึกลงในไฟล์โดยใช้Content-Typeจากส่วนหัว
ร่วงโรย

@AsleG ลิงก์นี้อาจมีประโยชน์
Wilt

@wilt หากฉันไม่ได้ใช้แบบฟอร์ม แต่ฉันต้องการใช้ formdata API ฉันจะทำแบบนั้นได้ไหม?
กีวีโกรธ

1
@AnkitKhettry ฟังดูเหมือนมีการอัปโหลดด้วยแบบฟอร์มหรือโดยใช้แบบฟอร์ม API 'สตริงแปลก' เหล่านี้ที่คุณอ้างถึงคือขอบเขตของแบบฟอร์มที่ปกติใช้เพื่อแยกข้อมูลฟอร์มออกเป็นส่วนต่าง ๆ บนเซิร์ฟเวอร์
เหี่ยวแห้ง

9

ฉันมีตัวอย่างรหัส Java:

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--

ฉันไม่แปลกใจที่เห็นตัวละคร9ieเพราะเราบอกให้ Java พิมพ์พวกเขาให้เป็นตัวละคร UTF-8 คุณอาจเลือกที่จะอ่านมันเป็นไบต์ดิบ ..

Cookie: JSESSIONID=27D0A0637A0449CF65B3CB20F40048AF 

จริง ๆ แล้วเป็นส่วนหัว HTTP ล่าสุดที่นี่ หลังจากนั้นมาถึงตัว HTTP ซึ่งเมตาและเนื้อหาของไฟล์ที่เราอัพโหลดจริงสามารถมองเห็นได้


6

ข้อความ HTTP อาจมีเนื้อความของข้อมูลที่ส่งหลังจากบรรทัดส่วนหัว ในการตอบสนองนี่คือที่ทรัพยากรที่ร้องขอถูกส่งคืนไปยังไคลเอนต์ (การใช้งานส่วนใหญ่ของข้อความ) หรืออาจเป็นข้อความอธิบายหากมีข้อผิดพลาด ในคำขอนี่คือที่ข้อมูลที่ผู้ใช้ป้อนหรือไฟล์ที่อัพโหลดถูกส่งไปยังเซิร์ฟเวอร์

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.