วิธีชิปด้วย 5 เซ็นต์ของฉัน:
TL, DR
ฉันใช้MimetypesFileTypeMapและเพิ่ม mime ใด ๆ ที่ไม่ได้อยู่ที่นั่นและฉันต้องการมันเป็นพิเศษในไฟล์ mime.types
และตอนนี้อ่านยาว:
ก่อนอื่นรายการประเภท MIME นั้นใหญ่มากดูได้ที่นี่: https://www.iana.org/assignments/media-types/media-types.xhtml
ฉันชอบใช้สิ่งอำนวยความสะดวกมาตรฐานที่ JDK จัดไว้ให้ก่อนและถ้าไม่ได้ผลฉันจะไปหาสิ่งอื่นแทน
กำหนดประเภทไฟล์จากนามสกุลไฟล์
ตั้งแต่ 1.6, Java มี MimetypesFileTypeMap ตามที่ระบุไว้ในคำตอบข้อใดข้อหนึ่งข้างต้นและเป็นวิธีที่ง่ายที่สุดในการกำหนดประเภท mime:
new MimetypesFileTypeMap().getContentType( fileName );
ในการติดตั้งวานิลลามันไม่ได้ทำอะไรมากมาย (เช่นใช้งานได้กับ. html แต่ไม่เหมาะสำหรับ. png) อย่างไรก็ตามเป็นเรื่องง่ายมากที่จะเพิ่มประเภทเนื้อหาใด ๆ ที่คุณอาจต้องการ:
- สร้างไฟล์ชื่อ 'mime.types' ในโฟลเดอร์ META-INF ในโครงการของคุณ
- เพิ่มบรรทัดสำหรับทุกประเภท mime ที่คุณต้องการและการใช้งานเริ่มต้นไม่ได้จัดเตรียมไว้ให้ (มีประเภทและรายการ mime หลายร้อยรายการเมื่อเวลาผ่านไป)
ตัวอย่างรายการสำหรับไฟล์ png และ js คือ:
image/png png PNG
application/javascript js
สำหรับรูปแบบไฟล์ mime.types ดูรายละเอียดเพิ่มเติมได้ที่นี่: https://docs.oracle.com/javase/7/docs/api/javax/activation/MimetypesFileTypeMap.html
กำหนดประเภทไฟล์จากเนื้อหาไฟล์
ตั้งแต่ 1.7, Java มีjava.nio.file.spi.FileTypeDetectorซึ่งได้กำหนดมาตรฐาน API สำหรับการกำหนดประเภทของไฟล์ในวิธีการเฉพาะการดำเนินงาน
ในการดึงข้อมูลประเภทไฟล์สำหรับไฟล์คุณเพียงแค่ใช้ไฟล์และทำสิ่งนี้ในรหัสของคุณ:
Files.probeContentType(Paths.get("either file name or full path goes here"));
นิยาม API จัดเตรียมสิ่งอำนวยความสะดวกที่สนับสนุนทั้งการพิจารณาชนิดไฟล์ mime จากชื่อไฟล์หรือจากเนื้อหาไฟล์ (magic bytes) นั่นคือเหตุผลที่probeContentType ()วิธีการโยน IOException ในกรณีที่การใช้งานของ API นี้ใช้เส้นทางที่ให้ไว้เพื่อที่จะพยายามเปิดไฟล์ที่เกี่ยวข้อง
อีกครั้งการใช้วานิลลาของสิ่งนี้ (อันที่มาพร้อมกับ JDK) ทำให้เป็นที่ต้องการอย่างมาก
ในโลกอุดมคติบางแห่งในกาแลคซีที่อยู่ห่างไกลห้องสมุดทั้งหมดเหล่านี้ซึ่งพยายามที่จะแก้ปัญหาแบบไฟล์ต่อไฟล์ mime นี้จะนำjava.nio.file.spi.FileTypeDetectorไปใช้งาน ไฟล์ลงใน classpath ของคุณและที่จะเป็น
ในโลกแห่งความจริงซึ่งเป็นส่วนที่คุณต้องการ TL, DR คุณควรหาห้องสมุดที่มีดาวส่วนใหญ่อยู่ถัดจากชื่อและใช้งาน สำหรับกรณีนี้ฉันไม่ต้องการ (แต่;))