Чтобы скинуть мои 5 центов:
TL, DR
Я использую MimetypesFileTypeMap и добавляю в файл mime.types любой mime, которого там нет, и он мне особенно нужен.
А теперь долго читал:
Прежде всего, список типов 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 и сделать это в своем коде:
Files.probeContentType(Paths.get("either file name or full path goes here"));
Определение API предоставляет средства, которые поддерживают либо определение типа mime файла по имени файла, либо по содержимому файла (волшебные байты). Вот почему метод probeContentType () выбрасывает IOException, если реализация этого API использует предоставленный ему Path, чтобы фактически попытаться открыть связанный с ним файл.
Опять же, ванильная реализация этого (того, что идет с JDK) оставляет желать лучшего.
В каком-то идеальном мире в далекой-далекой галактике все эти библиотеки, которые пытаются решить эту проблему типа «файл-пантомима», просто реализуют java.nio.file.spi.FileTypeDetector , вы можете оставить jar- файл предпочтительной библиотеки реализации. файл в ваш путь к классу, и это было бы так.
В реальном мире, где вам нужен раздел TL, DR, вы должны найти библиотеку с большинством звездочек рядом с ее именем и использовать ее. Для этого конкретного случая мне не нужен (пока;)).