Мне было просто интересно, как большинство людей выбирают mime-тип из файла на Java? До сих пор я попробовал два утилиты: JMimeMagic
& Mime-Util
.
Первый дал мне исключения памяти, второй не закрывает свои потоки должным образом. Мне просто интересно, есть ли у кого-то еще метод / библиотека, которые они использовали и работали правильно?
Ответы:
В Java 7 теперь вы можете просто использовать
Files.probeContentType(path)
.источник
null
за.xml
,.png
и.xhtml
файлы. Я не знаю, делаю ли я что-то ужасно неправильно, но это кажется довольно ужасным.К сожалению,
не работает, так как это использование URL оставляет файл заблокированным, так что, например, его невозможно восстановить.
Тем не менее, у вас есть это:
а также следующее, которое имеет преимущество в том, что оно выходит за рамки простого использования расширения файла и позволяет взглянуть на контент
Однако, как следует из приведенного выше комментария, встроенная таблица типов MIME довольно ограничена, не включая, например, MSWord и PDF. Итак, если вы хотите обобщить, вам нужно выйти за пределы встроенных библиотек, используя, например, Mime-Util (отличную библиотеку, использующую как расширение файла, так и содержимое).
источник
FileInputStream
вBufferedInputStream
критическую часть - иначеguessContentTypeFromStream
возвращаетсяnull
(переданныйInputStream
экземпляр должен поддерживать отметки)URLConnection
очень ограниченный набор типов контента, который он распознает. Например, он не может обнаружитьapplication/pdf
.guessContentTypeFromName()
использует$JAVA_HOME/lib/content-types.properties
файл по умолчанию . Вы можете добавить свой собственный расширенный файл, изменив системное свойствоSystem.setProperty("content.types.user.table","/lib/path/to/your/property/file");
JAF API является частью JDK 6. Посмотрите на
javax.activation
пакет.Наиболее интересными классами являются
javax.activation.MimeType
- фактический держатель типа MIME - иjavax.activation.MimetypesFileTypeMap
- класс, экземпляр которого может разрешать тип MIME как String для файла:источник
getContentType(File)
состояний: Возвращает MIME-тип файлового объекта. Реализация в этом классе вызываетgetContentType(f.getName())
.MimetypesFileTypeMap.getDefaultFileTypeMap().getContentType(file)
С Apache Tika вам нужно всего три строчки кода :
Если у вас отличная консоль, просто вставьте и запустите этот код, чтобы поиграть с ней:
Имейте в виду, что его API-интерфейсы богаты, он может анализировать «что угодно». Начиная с версии 1.14, у вас есть:
Смотрите apidocs для получения дополнительной информации.
источник
new Tika().detect(file.toPath())
для обнаружения на основе расширения файла, а не для обнаружения на основе содержимого файлаnew Tika().detect(file.getPath())
, который использует только расширение файлаApache Tika предлагает в tika-core обнаружение типа mime на основе магических маркеров в префиксе потока.
tika-core
не извлекает другие зависимости, что делает его таким же легковесным, как в настоящее время не поддерживаемая утилита обнаружения Mime-типов .Простой пример кода (Java 7) с использованием переменных
theInputStream
иtheFileName
Обратите внимание, что MediaType.detect (...) нельзя использовать напрямую ( TIKA-1120 ). Дополнительные советы предоставляются по адресу https://tika.apache.org/0.10/detection.html .
источник
Metadata.RESOURCE_NAME_KEY
может быть опущен (если у вас его нет или вы не можете полагаться на оригинальное имя), но в этом случае вы получите неправильный результат в некоторых случаях (например, офисные документы).Если вы разработчик Android, вы можете использовать служебный класс,
android.webkit.MimeTypeMap
который отображает MIME-типы на расширения файлов и наоборот.Следующий фрагмент кода может помочь вам.
источник
Из розеиндии :
источник
Если вы застряли с Java 5-6, то этот служебный класс из серво продукта с открытым исходным кодом .
Вам нужна только эта функция
Он проверяет первые байты содержимого и возвращает типы содержимого на основе этого содержимого, а не по расширению файла.
источник
Я опубликовал свой пакет Java SimpleMagic , который позволяет определять тип содержимого (mime-type) из файлов и байтовых массивов. Он предназначен для чтения и запуска магических файлов команд Unix file (1), которые являются частью большинства конфигураций ОС Unix.
Я попробовал Apache Tika, но он огромен с множеством зависимостей,
URLConnection
не использует байты файлов, аMimetypesFileTypeMap
также просто смотрит на имена файлов.С SimpleMagic вы можете сделать что-то вроде:
источник
Чтобы скинуть мои 5 центов:
TL, DR
Я использую MimetypesFileTypeMap и добавляю в файл mime.types любой mime, которого там нет, и он мне особенно нужен.
А теперь долго читал:
Прежде всего, список типов MIME огромен , см. Здесь: https://www.iana.org/assignments/media-types/media-types.xhtml
Мне нравится сначала использовать стандартные возможности, предоставляемые JDK, и если это не сработает, я пойду и поищу что-нибудь еще.
Определить тип файла по расширению файла
Начиная с 1.6, Java имеет MimetypesFileTypeMap, как указано в одном из ответов выше, и это самый простой способ определить тип mime:
В его ванильной реализации это мало что делает (т.е. работает для .html, но не для .png). Однако очень просто добавить любой тип контента, который вам может понадобиться:
Пример записи для файлов png и 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 и сделать это в своем коде:
Определение API предоставляет средства, которые поддерживают либо определение типа mime файла по имени файла, либо по содержимому файла (волшебные байты). Вот почему метод probeContentType () выбрасывает IOException, если реализация этого API использует предоставленный ему Path, чтобы фактически попытаться открыть связанный с ним файл.
Опять же, ванильная реализация этого (того, что идет с JDK) оставляет желать лучшего.
В каком-то идеальном мире в далекой-далекой галактике все эти библиотеки, которые пытаются решить эту проблему типа «файл-пантомима», просто реализуют java.nio.file.spi.FileTypeDetector , вы можете оставить jar- файл предпочтительной библиотеки реализации. файл в ваш путь к классу, и это было бы так.
В реальном мире, где вам нужен раздел TL, DR, вы должны найти библиотеку с большинством звездочек рядом с ее именем и использовать ее. Для этого конкретного случая мне не нужен (пока;)).
источник
Я попробовал несколько способов сделать это, включая первый, который сказал @Joshua Fox. Но некоторые не распознают частые mimetypes, как для файлов PDF, а другие не могут быть надежными с поддельными файлами (я пробовал с файлом RAR с расширением, измененным на TIF). Решение, которое я нашел, как также говорит @Joshua Fox поверхностно, заключается в использовании MimeUtil2 , например так:
источник
Для загрузки файлов лучше использовать двухуровневую проверку.
Сначала вы можете проверить mimeType и проверить его.
Во-вторых, вы должны преобразовать первые 4 байта вашего файла в шестнадцатеричное, а затем сравнить его с магическими числами. Тогда это будет действительно безопасный способ проверки файлов.
источник
Это самый простой способ, который я нашел для этого:
источник
Если вы работаете с сервлетом и если вам доступен контекст сервлета, вы можете использовать:
источник
getServletContext
?весной файл MultipartFile ;
file.getContentType();
источник
если вы работаете на ОС Linux, есть командная строка
file --mimetype
:затем
источник
Попробовав другие библиотеки, я остановился на mime-util.
источник
источник
Вы можете сделать это только одной строкой: MimetypesFileTypeMap (). GetContentType (new File ("filename.ext")) . Посмотрите полный тестовый код (Java 7):
Этот код производит следующий вывод: text / plain
источник
источник
Я сделал это с помощью следующего кода.
источник
Апач тика.
и две строки кода.
Снимок экрана ниже
источник