Чтобы скинуть мои 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, вы должны найти библиотеку с большинством звездочек рядом с ее названием и использовать ее. Для этого конкретного случая он мне не нужен (пока;)).