enctype = 'multipart / form-data' หมายถึงอะไร


คำตอบ:


1570

เมื่อคุณทำการร้องขอ POST คุณต้องเข้ารหัสข้อมูลที่เป็นเนื้อหาของคำขอในบางวิธี

รูปแบบ HTML มีวิธีการเข้ารหัสสามวิธี

  • application/x-www-form-urlencoded (ค่าเริ่มต้น)
  • multipart/form-data
  • text/plain

กำลังเพิ่มapplication/jsonงาน แต่ก็ถูกทอดทิ้ง

(การเข้ารหัสอื่นเป็นไปได้กับคำขอ HTTP ที่สร้างขึ้นโดยใช้วิธีอื่นนอกเหนือจากการส่งแบบฟอร์ม HTML JSON เป็นรูปแบบทั่วไปสำหรับใช้กับบริการเว็บและบางส่วนยังคงใช้ SOAP)

รูปแบบเฉพาะนั้นไม่สำคัญสำหรับนักพัฒนาส่วนใหญ่ จุดสำคัญคือ:

  • text/plainไม่เคยใช้งาน

เมื่อคุณเขียนรหัสฝั่งไคลเอ็นต์:

  • ใช้multipart/form-dataเมื่อฟอร์มของคุณมี<input type="file">องค์ประกอบใด ๆ
  • มิฉะนั้นคุณสามารถใช้multipart/form-dataหรือapplication/x-www-form-urlencodedแต่application/x-www-form-urlencodedจะมีประสิทธิภาพมากขึ้น

เมื่อคุณเขียนรหัสฝั่งเซิร์ฟเวอร์:

  • ใช้ไลบรารีการจัดการแบบฟอร์มที่เขียนไว้ล่วงหน้า

ส่วนใหญ่ (เช่น Perl CGI->paramหรือของ$_POSTsuperglobal ของ PHP ) จะดูแลความแตกต่างให้คุณ ไม่ต้องพยายามแยกวิเคราะห์ข้อมูลดิบที่ได้รับจากเซิร์ฟเวอร์

บางครั้งคุณจะพบห้องสมุดที่ไม่สามารถจัดการกับทั้งสองรูปแบบ ไลบรารียอดนิยมของ Node.js สำหรับการจัดการข้อมูลฟอร์มคือbody-parserซึ่งไม่สามารถจัดการคำขอหลายส่วนได้ (แต่มีเอกสารซึ่งแนะนำทางเลือกบางอย่างที่สามารถทำได้)


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

application/x-www-form-urlencoded จะมากหรือน้อยเหมือนสตริงการสืบค้นที่ส่วนท้ายของ URL

multipart/form-dataมีความซับซ้อนมากขึ้น แต่อนุญาตให้รวมไฟล์ทั้งหมดไว้ในข้อมูลได้ ตัวอย่างของผลที่สามารถพบได้ในHTML 4 สเปค

text/plainถูกนำเสนอโดย HTML 5 และมีประโยชน์สำหรับการดีบักเท่านั้น - จากข้อมูลจำเพาะ : พวกเขาไม่สามารถตีความได้อย่างน่าเชื่อถือโดยคอมพิวเตอร์ - และฉันยืนยันว่าคนอื่น ๆ รวมกับเครื่องมือ (เช่นแผงเครือข่ายในเครื่องมือนักพัฒนาของเบราว์เซอร์ส่วนใหญ่) จะดีกว่า สำหรับการที่).


5
@Quentin ขอโทษนะสิ่งที่จะเป็นปัญหาได้ถ้าเราใช้ multipart สำหรับทุกรูปแบบ? ด้วยและเล็กน้อยไฟล์
Webinan

12
มันไม่สมเหตุสมผลสำหรับฟอร์ม GET และทำให้ขนาดไฟล์ของคำขอใหญ่ขึ้น
เควนติน

@Quentin ข้อมูลแบบหลายส่วนส่งเป็นกระแสโดยปริยายหรือไม่
Growler

การเข้ารหัสในประเภทใช้แทนสิ่งใดได้หรือไม่
Philip Rego

1
"รูปแบบ HTML มีวิธีการตรวจสอบENCสามวิธี"
Quentin

449

เมื่อใดที่เราควรใช้

คำตอบของเควนตินเป็นขวา: การใช้งานmultipart/form-dataหากรูปแบบมีการอัปโหลดไฟล์และอย่างอื่นซึ่งเป็นค่าเริ่มต้นถ้าคุณไม่ใช้application/x-www-form-urlencodedenctype

ผมกำลังจะไป:

  • เพิ่มการอ้างอิง HTML5 เพิ่มเติม
  • อธิบายว่าทำไมเขาถึงพูดถูกด้วยแบบฟอร์มส่งตัวอย่าง

การอ้างอิง HTML5

มีสามความเป็นไปได้สำหรับenctype:

  • application/x-www-form-urlencoded
  • multipart/form-data(ข้อมูลจำเพาะจุดถึงRFC7578 )
  • 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เราก็ไม่ต้องการเพราะมันไม่มีประสิทธิภาพ

แต่สำหรับตัวอักษรที่พิมพ์ได้ที่พบในช่องข้อความมันไม่สำคัญและสร้างค่าใช้จ่ายน้อยลงดังนั้นเราจึงใช้มัน


3
@ Khanna111 %CFคือ 3 ไบต์ยาว%, CและF:-) เรื่องของการทำให้การอ่านของมนุษย์
Ciro Santilli 冠状病毒审查六四事件法轮功

6
บน OS X ncจะไม่ยอมรับทั้ง-lและ-pอาร์กิวเมนต์พร้อมกัน แต่สิ่งนี้ได้ผลกับฉัน: while true; do printf '' | nc -l 8000; done.
PhilipS

4
จุดเล็ก ๆ แต่สำคัญที่ไม่ได้กล่าวถึงก็คือว่าเขตแดนที่ระบุไว้ในContent-Typeมีสองยัติภังค์ ( --) --น้อยลงเช่นเมื่อใช้จริงเขตแดนในเนื้อหาของข้อความที่คุณจะต้องนำหน้าด้วย นอกจากนี้ขอบเขตสุดท้ายจะต้องต่อท้ายด้วย--แต่ก็ง่ายที่จะสังเกตเห็น ดูstackoverflow.com/questions/3508252/…
Bernard

1
เท่าที่ฉันสามารถบอกได้ว่าจุดใดที่ใส่ขีด จำกัด ใด ๆ ไว้ในขอบเขตก็คือทำให้มันเป็นไปไม่ได้ที่จะตรวจสอบไวยากรณ์ของคำขอด้วยตา โปรดอย่าใช้มันในโทเค็นขอบเขตของคุณ
Dewi Morgan

1
@DewiMorgan คุณพูดถูก ฉันแก้ไขโพสต์และลบเครื่องหมายขีดคั่นออกจากสตริงขอบเขต
สูงสุด

91

enctype='multipart/form-dataเป็นประเภทที่ช่วยให้การเข้ารหัสไฟล์จะถูกส่งผ่านโพสต์ ค่อนข้างง่ายหากไม่มีการเข้ารหัสไฟล์จะไม่สามารถส่งผ่านPOSTได้

หากคุณต้องการที่จะช่วยให้ผู้ใช้สามารถอัปโหลดไฟล์ผ่านทางรูปแบบที่คุณต้องใช้นี้enctype


ดังนั้น .. หากไฟล์ไม่ใช่ไฟล์ไบนารีเราสามารถทำงานได้โดยปราศจากสิ่งนี้ไหม?
Yugal Jindle

จากสิ่งที่ฉันเข้าใจคุณสามารถใช้multipart/form-dataสำหรับการส่งไฟล์ที่ไม่ใช่ไบนารี แต่มันไม่มีประสิทธิภาพ ฉันเชื่อว่าการใช้application/x-www-form-urlencodedเป็นวิธีที่ถูกต้องในการส่งข้อมูลที่ไม่ใช่ไบนารี แต่บางคนที่มีประสบการณ์เกี่ยวกับไฟล์ที่ไม่ใช่ไบนารีอาจต้องแก้ไขฉัน
Matt Asbury

11
ข้อได้เปรียบหลักในการใช้multipart/form-dataสำหรับส่งไฟล์คือมันจะทำงานโดยอัตโนมัติทั้งในส่วนหน้าและส่วนหลัง คุณไม่ต้องทำอะไรเป็นพิเศษ ไฟล์ทั้งหมดเป็นไบนารีแม้ว่าพวกเขาควรจะมีข้อความเท่านั้น application/x-www-form-urlencodedเป็นวิธีมาตรฐานในการโพสต์รูปแบบโดยไม่ต้องแนบไฟล์ multipart/form-dataเป็นวิธีมาตรฐานในการโพสต์แบบฟอร์มพร้อมไฟล์ที่แนบมา (นอกจากนี้ยังมีการเข้ารหัสอื่น ๆ อีกมากมายเช่นapplication/jsonและapplication/json-patch+jsonซึ่งเป็นเรื่องปกติสำหรับการสื่อสารระหว่างเซิร์ฟเวอร์และไคลเอนต์)
Daniel Luna

6
มันมีค่าที่ชี้ให้เห็นว่าคุณสามารถ base64 เข้ารหัสภาพของคุณและส่งเป็นข้อมูลสตริงธรรมดา
James

3
ต่อไป @ คิดเห็นพรเหนือ: multipart/form-dataคุณอย่างสามารถส่งไฟล์ผ่านทางไปรษณีย์โดยไม่ต้องใช้ สิ่งที่คุณไม่สามารถทำได้คือใช้การส่งแบบฟอร์ม HTML ธรรมดาโดยไม่มี JavaScript การตั้งค่ารูปแบบที่จะใช้multipart/form-dataเป็นกลไกเดียวที่HTMLจัดเตรียมไว้ให้คุณใช้ไฟล์ POST โดยไม่ต้องใช้ JavaScript ฉันรู้สึกว่ามันไม่ชัดเจนในคำตอบและผู้อ่านที่ไร้เดียงสาอาจคิดว่าการไม่สามารถส่งไฟล์โดยไม่มีmultipart/form-dataข้อ จำกัด ของHTTP ; นั่นไม่ใช่กรณี
Mark Amery

81

เมื่อส่งแบบฟอร์มคุณจะบอกให้เบราว์เซอร์ของคุณส่งผ่านโปรโตคอล HTTP ข้อความบนเครือข่ายห่อหุ้มอย่างเหมาะสมในโครงสร้างข้อความโปรโตคอล TCP / IP หน้า HTML มีวิธีการส่งข้อมูลไปยังเซิร์ฟเวอร์: โดยใช้<form>s

เมื่อส่งแบบฟอร์มคำขอ HTTP จะถูกสร้างและส่งไปยังเซิร์ฟเวอร์ข้อความจะมีชื่อฟิลด์ในแบบฟอร์มและค่าที่กรอกโดยผู้ใช้ ส่งนี้จะเกิดขึ้นกับPOSTหรือวิธีการGET HTTP

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

ระบุวิธีส่งแบบฟอร์มของคุณไปยังเซิร์ฟเวอร์

แอตทริบิวต์enctypeมีเหตุผลเมื่อใช้POSTวิธีการเท่านั้น เมื่อระบุจะสั่งให้เบราว์เซอร์ส่งแบบฟอร์มโดยการเข้ารหัสเนื้อหาในแบบเฉพาะ จากMDN - ประเภทฟอร์ม :

เมื่อค่าของวิธีการโพสต์แอตทริบิวต์ enctype เป็นประเภท MIME ของเนื้อหาที่ใช้ในการส่งแบบฟอร์มไปยังเซิร์ฟเวอร์

  • application/x-www-form-urlencoded: นี่เป็นค่าเริ่มต้น เมื่อส่งแบบฟอร์มชื่อและค่าทั้งหมดจะถูกรวบรวมและการเข้ารหัส URLจะดำเนินการกับสตริงสุดท้าย
  • multipart/form-data: อักขระจะไม่ถูกเข้ารหัส สิ่งนี้สำคัญเมื่อฟอร์มมีตัวควบคุมการอัปโหลดไฟล์ คุณต้องการส่งไฟล์ไบนารี่และสิ่งนี้ทำให้มั่นใจได้ว่าบิทสตรีมจะไม่เปลี่ยนแปลง
  • text/plain: Spaces ได้รับการแปลง แต่จะไม่มีการเข้ารหัสอีก

ความปลอดภัย

เมื่อส่งแบบฟอร์มความกังวลด้านความปลอดภัยบางอย่างอาจเกิดขึ้นตามที่ระบุไว้ในRFC 7578 ส่วนที่ 7: ข้อมูลแบบฟอร์มหลายส่วน - ข้อควรพิจารณาด้านความปลอดภัย :

ซอฟต์แวร์ประมวลผลแบบฟอร์มทั้งหมดควรปฏิบัติต่อข้อมูลฟอร์มผู้ใช้ที่ให้มา
ด้วยความไวเนื่องจากมักจะมีข้อมูลที่เป็นความลับหรือการ
ระบุตัวตน มีการใช้คุณสมบัติ "กรอกข้อมูลอัตโนมัติ" ในเว็บเบราว์เซอร์อย่างแพร่หลาย สิ่งเหล่านี้อาจถูกใช้เพื่อหลอกลวงผู้ใช้ให้
ส่งข้อมูลที่เป็นความลับโดยไม่รู้ตัวเมื่อ
ทำงานที่ไม่มีพิษภัยเป็นอย่างอื่น multipart / form-data ไม่ได้จัดหาฟีเจอร์ใด ๆ
สำหรับการตรวจสอบความสมบูรณ์ของการรับประกันความลับการหลีกเลี่ยง
ความสับสนของผู้ใช้หรือคุณลักษณะความปลอดภัยอื่น ๆ ข้อกังวลเหล่านั้นจะต้องได้รับการ
แก้ไขโดยแอปพลิเคชันการกรอกแบบฟอร์มและแบบฟอร์มการแปลข้อมูล

แอปพลิเคชันที่ได้รับแบบฟอร์มและประมวลผลนั้นจะต้องระมัดระวังไม่ให้ข้อมูลกลับไปยังไซต์การประมวลผลแบบฟอร์มที่ร้องขอซึ่งไม่ได้ตั้งใจจะส่ง

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

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


1
สิ่งที่เกี่ยวกับความปลอดภัยหลังจากการแก้ไขล่าสุดนั้นไม่เกี่ยวข้องกับคำถามของสิ่งที่enctypeทำ ฉันรู้ว่ามันอย่างแท้จริงจากmultipart/form-dataRFC แต่อย่างไรก็ตามมันเป็นการถ่ายโอนข้อมูลโดยพลการของการพิจารณาความปลอดภัยเกี่ยวกับการส่งรูปแบบที่มีฉากทั้งหมดให้กับว่าข้อมูลจะถูกส่งเป็นหรือapplication/x-www-form-urlencoded multipart/form-data
Mark Amery

38

enctype='multipart/form-data'หมายความว่าจะไม่มีการเข้ารหัสอักขระ นั่นคือเหตุผลที่ใช้ชนิดนี้ในขณะอัพโหลดไฟล์ไปยังเซิร์ฟเวอร์
ดังนั้นmultipart/form-dataจะใช้เมื่อแบบฟอร์มต้องการข้อมูลไบนารีเช่นเนื้อหาของไฟล์ที่จะอัปโหลด


8

ตั้งค่าแอตทริบิวต์ method เป็น POST เนื่องจากไม่สามารถใส่เนื้อหาไฟล์ไว้ในพารามิเตอร์ URL โดยใช้แบบฟอร์ม

ตั้งค่าของ enctype เป็นหลายส่วน / form-data เนื่องจากข้อมูลจะถูกแบ่งออกเป็นหลายส่วนหนึ่งสำหรับแต่ละไฟล์บวกหนึ่งสำหรับข้อความของร่างกายแบบฟอร์มที่อาจส่งไปกับพวกเขา


นี่หมายความว่าPOSTมีแนวโน้มว่าจะเพียงพอสำหรับการส่งไฟล์ผ่านแบบฟอร์มและการเพิ่มmultipart/form-dataเป็นเพียงโบนัสในทางที่คลุมเครือ นั่นไม่ใช่กรณี multipart/form-dataไฟล์ส่วนใหญ่อย่างจะต้องใช้
underscore_d

1
  • แอ็ตทริบิวต์enctype ( ENC ode TYPE ) ระบุวิธีการเข้ารหัสข้อมูลฟอร์มเมื่อส่งไปยังเซิร์ฟเวอร์
  • multipart / form-data เป็นหนึ่งในค่าของแอตทริบิวต์ enctype ซึ่งใช้ในองค์ประกอบของฟอร์มที่มีการอัปโหลดไฟล์ หลายส่วนหมายถึงข้อมูลในฟอร์มแบ่งออกเป็นหลายส่วนและส่งไปยังเซิร์ฟเวอร์

5
ฉันเชื่อว่าenctypeไม่รองรับการเข้ารหัส ไม่มีการเข้ารหัสที่เกี่ยวข้องในระดับนี้ ฉันเดาว่าเป็นแบบเข้ารหัสหรือแบบปิด แต่แน่นอนว่ามันไม่ใช่ประเภทการเข้ารหัส
Yeo

1
สัญลักษณ์แสดงหัวข้อย่อยสุดท้ายของคุณที่นี่เกี่ยวกับ<head>และ<body>ไม่เกี่ยวข้องและสับสน
Mark Amery

0

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


-3

คุณลักษณะ enctype ระบุวิธีการเข้ารหัสข้อมูลแบบฟอร์มเมื่อส่งไปยังเซิร์ฟเวอร์

แอตทริบิวต์ enctype สามารถใช้ได้เฉพาะถ้า method = "post"

ไม่มีการเข้ารหัสอักขระ จำเป็นต้องใช้ค่านี้เมื่อคุณใช้ฟอร์มที่มีการควบคุมการอัปโหลดไฟล์

จากW3Schools


2
multipart/form-dataคำพูดนี้ไม่ได้พูดถึง มันค่อนข้างชัดเจน ประโยค "ไม่มีการเข้ารหัสอักขระ" หมายความว่าอย่างไร -1
Mark Amery
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.