Files.probeContentType() возвращает null в OpenJDK 11

#java #file-io #java-11

#java #file-io #java-11

Вопрос:

Кажется, что Files.probeContentType() возвращает null для файла (где тип MIME не указан в его имени файла) на OpenJDK 11, в то время как он работал на OpenJDK 8 (в Linux x64). В чем причина этого?

Примечание: это может работать для файлов, где тип указывается его именем, например, «test.pdf» приведет к «application / pdf», но переименование файла в «test» приведет null к.

Комментарии:

1. Невозможно воспроизвести. Я запустил Files.probeContentType(Paths.get("test.pdf")) Window, используя Oracle 1.8.0_181, OpenJDK 11.0.2 и AdoptOpenJDK 15.0.1 9, и все они вернулись application/pdf .

2. @Andreas, это зависит от платформы. В Windows есть RegistryFileTypeDetector функция, которая определяет тип на основе расширения имени файла, сопоставляемого приложению в реестре Windows.

3. @Andreas, в Windows вы можете воспроизвести это, переименовав свой PDF-файл в «test» без расширения. (Единственный) доступный детектор не проверяет содержимое, но не сможет выполнить поиск (несуществующего) расширения в реестре.

Ответ №1:

Определение типа файла в значительной степени зависит от платформы и не считалось надежным. Например, GnomeFileTypeDetector был доступен в JDK 8, но работает только в системах Linux.

Разработчики OpenJDK решили удалить оба GnomeFileTypeDetector и MagicFileTypeDetector из JDK (уже в JDK 9), см. OpenJDK bug tracker и здесь .

Доступные детекторы MimeTypesFileTypeDetector (в Linux) или RegistryFileTypeDetector в Windows просто реализуют сопоставление расширений имен файлов с типами MIME, но не проверяют фактическое содержимое файлов.

(Примечание: все реализации детектора найдены (или нет) в пакете sun.nio.fs .)

Ответ №2:

У меня такая же проблема в контейнере docker с Ubuntu 20.04. Обычно контейнер очень маленький и имеет очень специфические инструменты. Я решил проблему установки пакетов libmagic-mgc и libmagic1 с помощью команды apt, которая содержит знаменитую команду «file», используемую для проверки MimeType файла.