ขอบเขตใน multipart / form-data คืออะไร


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
คุณต้องเพิ่ม "-" พิเศษในตอนท้ายของขอบเขต
เซบาสเตียน Piskorski

13
คุณสามารถอ่านได้ในเอกสาร การสิ้นสุดของขอบเขตจะต้องมีไฮเปอร์สองตัว "-" ลิงก์: w3.org/TR/html401/interact/forms.html#h-17.13.4.2
เซบาสเตียน Piskorski

6
คำตอบที่ดี ขอบเขตเป็นเพียง 'คีย์' เพื่อแยก "ส่วน" หลายส่วนของส่วนของข้อมูลที่มีหลายส่วน โดยปกติแล้วบางสิ่งเช่น '&' ก็เพียงพอที่จะแยกตัวแปร แต่คุณต้องการสิ่งที่พิเศษกว่าในการแยกส่วนของข้อมูลภายในส่วนของข้อมูล
user2483724

1
@ K3rnel31 แน่นอนเว้นแต่สตริงขอบเขตใหม่มีความยาวเท่ากัน
Oscar Mederos

5
ฉันคิดว่าค่าขอบเขตตามที่ประกาศไว้ในส่วนหัวของประเภทเนื้อหาจะเป็น -XXX --- เพราะควรเขียนพิเศษ "-" เมื่อแยกส่วน (ดังนั้น --- XXX ---)
Theodore K .

96

คำตอบที่แน่นอนสำหรับคำถามคือ: ใช่คุณสามารถใช้ค่าตามอำเภอใจของ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--

2
ฉันชอบคำตอบนี้มากที่สุดเพราะคำพูดจาก RFC เกี่ยวกับวิธีการระบุยัติภังค์
Rick

@Rick มีเหตุผลที่ถูกต้องที่ IETF จะทำเช่นนั้น - แม้ว่าพวกเขาจะดูค่อนข้างเหมือนกัน แต่หนึ่งในสี่ต่อไปนี้เป็นอักขระยัติภังค์ที่ถูกต้อง: ˗ - - -
antichris

เมื่อฉันพูดว่าไฮเปอร์ฉันหมายความว่าคำตอบของคุณบอกฉันว่าไฮเปอร์ใดที่กำหนดไว้ในมาตรฐาน ฉันสับสนเกี่ยวกับว่าไฮเปอร์คือ "ไคลเอนต์ที่กำหนด" และ "สเปคที่กำหนด"
Rick

31

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 โดยการเพิ่มขอบเขตซึ่งทำงานได้ดี

ดูRFC1341 sec7.2 The Multipart Content-Type

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