← เครื่องมือทั้งหมด

อ้างอิง MIME Types

MIME types คืออะไร รูปแบบ type/subtype ทำงานอย่างไร Content-Type สำคัญใน HTTP และอีเมลอย่างไร ประเภทที่พบบ่อย และทำไมประเภทผิดทำให้เสีย
นามสกุลไฟล์ประเภท MIME

MIME type คืออะไรกันแน่

MIME type หรือที่เรียกว่า media type คือป้ายกำกับสั้น ๆ ที่บอกซอฟต์แวร์ว่าไฟล์หรือเนื้อหาของข้อความมีข้อมูลชนิดใด เกิดขึ้นในอีเมล (ชื่อย่อมาจาก Multipurpose Internet Mail Extensions) แต่ปัจจุบันปรากฏอยู่ทุกที่บนเว็บ รูปแบบจะเป็น type/subtype เสมอ ได้แก่ หมวดหมู่กว้าง เครื่องหมายทับ และรูปแบบเฉพาะ ดังนั้น text/html หมายถึง "ข้อความในรูปแบบ HTML", image/png หมายถึง "รูปภาพในรูปแบบ PNG" และ application/json หมายถึง "ข้อมูลแอปพลิเคชันเข้ารหัสเป็น JSON"

type ระดับบนมาจากชุดที่กำหนดโดย IANA ซึ่งเป็นทะเบียนอย่างเป็นทางการ ได้แก่ text, image, audio, video, application, font, model, multipart และอีกไม่กี่รายการที่ใหม่กว่าเช่น haptics ส่วน subtype คือรูปแบบเฉพาะ ผู้ผลิตสามารถเพิ่มของตนเองด้วยคำนำหน้า vnd. (เช่น application/vnd.ms-excel) และประเภททดลองในอดีตใช้คำนำหน้า x- แม้ว่าข้อตกลงนั้นปัจจุบันไม่แนะนำแล้ว

ไอคอนรูปแบบไฟล์เรืองแสงที่จัดเรียงในแผ่นหมวดหมู่ที่มีป้ายบนพื้นหลังสีคราม
ทุกรูปแบบไฟล์แมปกับป้ายกำกับ type/subtype

MIME type สำคัญตรงไหน

สถานที่เดียวที่สำคัญที่สุดที่ MIME type ปรากฏคือ HTTP header Content-Type ในการตอบกลับ เมื่อเซิร์ฟเวอร์ส่งหน้าเว็บ รูปภาพ หรือ payload ของ API header นี้บอกเบราว์เซอร์ว่าจะตีความ byte อย่างไร ถ้า header บอกว่า text/html เบราว์เซอร์จะแสดงผล markup ถ้าบอกว่า application/json การเรียก fetch() สามารถ parse ได้ ถ้าบอกว่า application/pdf ตัวดูในตัวเบราว์เซอร์จะเปิด header เดียวกันนี้เดินทางในฝั่ง request ด้วย เมื่อคุณ POST ฟอร์มหรือ API body Content-Type บอกเซิร์ฟเวอร์ว่าจะอ่านสิ่งที่คุณส่งมาอย่างไร

นอกจาก HTTP แล้ว MIME type ยังขับเคลื่อนระบบอื่น ๆ อีกหลายระบบ ไคลเอนต์อีเมลใช้มันเพื่อตัดสินว่าไฟล์แนบเป็นรูปภาพที่ต้องแสดงตัวอย่างหรือไบนารีที่ต้องบันทึก ตัวจัดการการอัปโหลดไฟล์ตรวจสอบประเภทที่ประกาศเพื่อรับหรือปฏิเสธไฟล์ และระบบปฏิบัติการหรือเบราว์เซอร์ใช้ประเภท ไม่ใช่แค่นามสกุลไฟล์ เพื่อเลือกแอปพลิเคชันเริ่มต้น แนวคิดเดียวกันนี้รองรับวิธีที่เซิร์ฟเวอร์รายงานผลลัพธ์และข้อผิดพลาดควบคู่กับ HTTP status codes — การตอบกลับ 200 พร้อมประเภทที่ผิดอาจเสียหายพอ ๆ กับ 404

ประเภทที่คุณจะใช้ทุกวัน

ประเภทไม่กี่รายการครอบคลุม traffic จริงส่วนใหญ่:

  • text/html — หน้าเว็บ (นามสกุล .html)
  • text/css — stylesheet (.css)
  • text/javascript — ประเภทแนะนำสำหรับ JavaScript (.js, .mjs)
  • application/json — ประเภท JSON อย่างเป็นทางการหนึ่งเดียว กำหนดใน RFC 8259 (.json)
  • image/png, image/jpeg, image/webp, image/svg+xml — รูปแบบรูปภาพทั่วไป
  • application/pdf — เอกสาร PDF (.pdf)
  • application/octet-stream — ค่าเริ่มต้นสำหรับข้อมูลไบนารีที่ไม่รู้จักหรือทั่วไป
  • text/plain — ค่าเริ่มต้นสำหรับข้อความธรรมดาที่ไม่มีประเภทที่สมบูรณ์กว่า

JSON ควรกล่าวถึงเป็นพิเศษเพราะทำให้คนสับสนบ่อย ประเภทที่ถูกต้องเพียงอย่างเดียวคือ application/json โค้ดเก่าบางครั้งใช้ text/json, text/plain หรือ application/x-javascript แต่ประเภทเหล่านั้นล้าสมัยแล้วและไคลเอนต์บางตัวจะปฏิเสธการ parse ไม่มี charset parameter สำหรับ JSON ด้วย — ข้อกำหนดกำหนด UTF-8 ดังนั้นการเขียน application/json; charset=utf-8 จึงซ้ำซ้อนแม้ว่าจะไม่เป็นอันตราย สำหรับตารางรูปแบบและนามสกุลที่ครบถ้วนกว่า ดู ตารางอ้างอิง ของเรา

แพ็กเก็ตข้อมูลเรืองแสงที่ติดป้ายชนิดนามธรรมไหลผ่านการเชื่อมต่อเครือข่าย
Content-Type เดินทางพร้อมกับ payload ผ่าน HTTP

ทำไม Content-Type ที่ผิดจึงทำให้สิ่งต่าง ๆ พัง

เบราว์เซอร์และไคลเอนต์เชื่อประเภทที่ประกาศ ดังนั้นการใส่ผิดจึงมีผลลัพธ์ที่เป็นรูปธรรม ส่งการตอบกลับ JSON API ในรูปแบบ text/html แล้วเบราว์เซอร์อาจพยายามแสดงผล หรือไคลเอนต์ที่เข้มงวดอาจแสดงข้อผิดพลาด parse ก่อนที่โค้ดของคุณจะทำงาน ส่งไฟล์ CSS หรือ JavaScript ด้วยประเภทที่ผิดและ feature ความปลอดภัยที่ชื่อ X-Content-Type-Options: nosniff จะทำให้เบราว์เซอร์ปฏิเสธที่จะนำไปใช้ ซึ่งทำให้ style หรือสคริปต์หน้าเว็บของคุณเสียหายโดยเงียบ

การดาวน์โหลดเป็นความล้มเหลวคลาสสิกอีกอย่าง ถ้าต้องการให้ไฟล์ดาวน์โหลดแทนที่จะแสดง ประเภทนั้นสำคัญควบคู่กับ header Content-Disposition PDF ที่ส่งในรูปแบบ application/octet-stream จะดาวน์โหลดเป็นไฟล์ทั่วไปแทนที่จะเปิดในตัวดู รูปภาพที่ส่งในรูปแบบ text/plain จะแสดงเป็นอักขระไม่สื่อความหมาย ในฝั่งการอัปโหลด ไฟล์ที่ติดป้ายผิดอาจผ่านการตรวจสอบนามสกุลแบบง่าย ซึ่งเป็นเหตุผลว่าทำไม validator ที่แข็งแกร่งจึงตรวจสอบ byte จริง ("magic number") แทนที่จะเชื่อประเภทที่ไคลเอนต์ระบุมา

ในอดีต เบราว์เซอร์พยายามเดาหรือ "sniff" ประเภทจริงเมื่อ header ดูผิด พฤติกรรมนั้นก่อให้เกิดช่องโหว่ความปลอดภัย ดังนั้นแนวปฏิบัติที่ดีในปัจจุบันคือส่ง Content-Type ที่ถูกต้องเสมอและปิดการ sniff ด้วย nosniff สรุปสั้น ๆ คือ ตั้งค่าประเภทอย่างตั้งใจในทุกการตอบกลับ และบั๊กการแสดงผล ดาวน์โหลด และ parse ส่วนใหญ่จะหายไป

คำถามที่พบบ่อย

ความแตกต่างระหว่าง MIME type และ media type คืออะไร?

เป็นสิ่งเดียวกัน "MIME type" เป็นชื่อเก่าจากอีเมล ในขณะที่ "media type" เป็นคำที่ IANA และข้อกำหนด HTTP สมัยใหม่นิยมใช้ ทั้งสองอ้างถึงป้ายกำกับ type/subtype

MIME type ที่ถูกต้องสำหรับ JSON คืออะไร?

คือ application/json ที่กำหนดใน RFC 8259 ทางเลือกเก่าอย่าง text/json หรือ application/x-javascript ล้าสมัยแล้วและไคลเอนต์บางตัวจะปฏิเสธ

application/octet-stream หมายความว่าอะไร?

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

ทำไมไฟล์ CSS หรือ JavaScript ของฉันไม่โหลด?

บ่อยครั้งเซิร์ฟเวอร์ส่งมันพร้อม Content-Type ที่ผิด เมื่อตั้ง X-Content-Type-Options เป็น nosniff เบราว์เซอร์จะปฏิเสธนำ CSS ที่ไม่ใช่ text/css หรือสคริปต์ที่ไม่ใช่ประเภท JavaScript ไปใช้ แก้ไขการตั้งค่าเซิร์ฟเวอร์เพื่อส่งประเภทที่ถูกต้อง

สามารถเพิ่ม charset ใน MIME type ได้ไหม?

ได้ สำหรับรูปแบบข้อความ โดยใช้ parameter เช่น text/html; charset=utf-8 สำหรับ JSON ไม่จำเป็นเพราะรูปแบบเป็น UTF-8 เสมอตามข้อกำหนด แม้ว่าการเพิ่มไม่ก่อให้เกิดอันตราย

นามสกุลไฟล์กำหนด MIME type หรือไม่?

ไม่ใช่ผ่าน HTTP เซิร์ฟเวอร์ตัดสินใจว่าจะส่ง Content-Type ใด และเบราว์เซอร์เชื่อ header นั้น นามสกุลทำหน้าที่เป็นแค่คำใบ้สำหรับเครื่องมือและระบบปฏิบัติการเมื่อไม่มีการระบุประเภทอย่างชัดเจน