Щоб підключитися до моїх 5 центів:
TL, DR
Я використовую MimetypesFileTypeMap і додаю будь-яку міму, якої немає, і мені спеціально це потрібно, у файл 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 для визначення типу файлу в конкретному варіанті реалізації .
Щоб отримати тип mime для файлу, ви просто скористаєтеся файлами та зробіть це у своєму коді:
Files.probeContentType(Paths.get("either file name or full path goes here"));
Визначення API передбачає засоби, які підтримують або визначення типу файлу mime з імені файлу, або з вмісту файлу (магічні байти). Ось чому probeContentType () кидає IOException, у випадку, якщо реалізація цього API використовує наданий йому шлях, щоб фактично спробувати відкрити пов'язаний з ним файл.
Знову ж таки, ванільна реалізація цього (тієї, що постачається з JDK) залишає бажати кращого.
У якомусь ідеальному світі в галактиці далеко-далеко, всі ці бібліотеки, які намагаються вирішити цю проблему типу файлу до міму, просто реалізують java.nio.file.spi.FileTypeDetector , ви в бажаний баночку бібліотеки, що реалізується. файл у ваш класний шлях і це було б все.
У реальному світі, тому, де вам потрібен розділ TL, DR, ви повинні знайти бібліотеку з більшою кількістю зірок поруч із своїм ім'ям та використовувати її. У цьому конкретному випадку мені це не потрібно (поки;)).