multipart/form-data
ผมอยากจะถามคำถามเกี่ยวกับการที่ ในส่วนหัวของ HTTP Content-Type: multipart/form-data; boundary=???
ผมพบว่า
ผู้???
ใช้สามารถกำหนดได้ฟรีหรือไม่? หรือมันสร้างจาก HTML? มันเป็นไปได้สำหรับผมที่จะกำหนด??? = abcdefg
?
multipart/form-data
ผมอยากจะถามคำถามเกี่ยวกับการที่ ในส่วนหัวของ HTTP Content-Type: multipart/form-data; boundary=???
ผมพบว่า
ผู้???
ใช้สามารถกำหนดได้ฟรีหรือไม่? หรือมันสร้างจาก HTML? มันเป็นไปได้สำหรับผมที่จะกำหนด??? = abcdefg
?
คำตอบ:
ผู้
???
ใช้สามารถกำหนดได้ฟรีหรือไม่?
ใช่.
หรือมันมาจาก 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 ที่ส่งไปยังเซิร์ฟเวอร์
ให้สอดคล้องและใช้ค่าเดียวกันทุกที่ในข้อความคำขอ
คำตอบที่แน่นอนสำหรับคำถามคือ: ใช่คุณสามารถใช้ค่าตามอำเภอใจของboundary
พารามิเตอร์เนื่องจากความยาวไม่เกิน 70 ไบต์และประกอบด้วยอักขระ7 บิตUS-ASCII
(พิมพ์ได้) เท่านั้น
หากคุณกำลังใช้หนึ่งในmultipart/*
ประเภทเนื้อหาคุณจำเป็นต้องระบุboundary
พารามิเตอร์ในContent-Type
ส่วนหัวมิฉะนั้นเซิร์ฟเวอร์ (ในกรณีของคำขอ HTTP) จะไม่สามารถแยกวิเคราะห์ส่วนของข้อมูลได้
คุณอาจต้องการตั้งค่าcharset
พารามิเตอร์ไว้UTF-8
ในContent-Type
ส่วนหัวของคุณเว้นแต่คุณจะมั่นใจได้อย่างแน่นอนว่าUS-ASCII
จะใช้ชุดอักขระเฉพาะในข้อมูลส่วนของข้อมูลเท่านั้น
ข้อความที่ตัดตอนมาบางส่วนจากRFC2046 :
4.1.2 พารามิเตอร์ชุดอักขระ:
ไม่เหมือนกับค่าพารามิเตอร์อื่น ๆ ค่าของพารามิเตอร์ charset จะไม่ตรงตามตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก ชุดอักขระเริ่มต้นซึ่งต้องสันนิษฐานว่าไม่มีพารามิเตอร์ชุดอักขระคือ US-ASCII
5.1 Multipart Media Type
ตามที่ระบุไว้ในคำจำกัดความของฟิลด์เข้ารหัสการถ่ายโอนเนื้อหา [RFC 2045] ไม่อนุญาตให้เข้ารหัสอื่นนอกจาก "7 บิต", "8 บิต" หรือ "ไบนารี" สำหรับเอนทิตีประเภท "multipart" เขตแดนตัวคั่นแบบหลายส่วนและเขตข้อมูลส่วนหัวจะแสดงเป็น 7 บิต US-ASCII ในทุกกรณี (แม้ว่าเขตข้อมูลส่วนหัวอาจเข้ารหัสข้อความส่วนหัวที่ไม่ใช่ US-ASCII ตาม RFC 2047) และข้อมูลภายในส่วนของร่างกายสามารถเข้ารหัสบน พื้นฐานทีละส่วนกับเขตข้อมูลการถ่ายโอนการเข้ารหัสเนื้อหาสำหรับแต่ละส่วนของร่างกายที่เหมาะสม
ฟิลด์ประเภทเนื้อหาสำหรับเอนทิตีหลายส่วนต้องการหนึ่งพารามิเตอร์ "ขอบเขต" จากนั้นจะกำหนดบรรทัดตัวคั่นขอบเขตเป็นบรรทัดที่ประกอบด้วยอักขระยัติภังค์สองตัว ("-", ค่าทศนิยม 45) ตามด้วยค่าพารามิเตอร์ขอบเขตจากฟิลด์ส่วนหัว Content-Type, ช่องว่างเชิงเส้นเสริมและ CRLF ที่ยกเลิก
ตัวคั่นขอบเขตจะต้องไม่ปรากฏในวัสดุห่อหุ้มและจะต้องมีความยาวไม่เกิน 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--
multipart / form-data มีขอบเขตการแยกคู่ชื่อ / ค่า ขอบเขตทำหน้าที่เหมือนเครื่องหมายของแต่ละคู่ของชื่อ / ค่าที่ส่งผ่านเมื่อส่งแบบฟอร์ม ขอบเขตจะถูกเพิ่มลงในประเภทเนื้อหาของส่วนหัวคำขอโดยอัตโนมัติ
แอตทริบิวต์ที่มีรูปแบบenctype = "multipart / form-data"จะมีส่วนหัวคำขอ Content-Type: multipart / form-data; ขอบเขต --- 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--
ทางด้านเว็บเซอร์วิสจะถูกใช้ในรูปแบบ @Consumes ("multipart / form-data")
ระวังเมื่อทดสอบ webservice ของคุณโดยใช้ chrome postman คุณจะต้องตรวจสอบตัวเลือก data form (ปุ่มตัวเลือก) และเมนู File จากกล่องดร็อปดาวน์เพื่อส่งไฟล์แนบ การจัดเตรียมเนื้อหาชนิดที่ชัดเจนเป็นหลายส่วน / แบบฟอร์มข้อมูลจะเกิดข้อผิดพลาด เนื่องจากขอบเขตหายไปเนื่องจากมันแทนที่คำขอ curl ของ post man ไปยังเซิร์ฟเวอร์ด้วย content-type โดยการเพิ่มขอบเขตซึ่งทำงานได้ดี