- Saved searches
- Use saved searches to filter your results more quickly
- License
- overview/mime-types
- Name already in use
- Sign In Required
- Launching GitHub Desktop
- Launching GitHub Desktop
- Launching Xcode
- Launching Visual Studio Code
- Latest commit
- Git stats
- Files
- README.md
- About
- Получение Mime-типа файла в Java
- 2. Использование Java 7
- 3. ИспользуяURLConnection
- 3.1. ИспользуяgetContentType()
- 3.2. ИспользуяguessContentTypeFromName()
- 3.3. ИспользуяgetFileNameMap ()
- 4. ИспользуяMimeTypesFileTypeMap
- 5. Использование jMimeMagic
- 6. Использование Apache Tika
- 7. Заключение
- Получение типа Mime файла в Java
- 2. Использование Java 7
- 3. Использование URLConnection
- 3.1. Использование getContentType()
- 3.2. Использование guessContentTypeFromName()
- 3.3. Использование getFileNameMap()
- 4. Использование MimetypesFileTypeMap
- 5. Использование jMimeMagic
- 6. Использование Apache Tika
- 7. Заключение
Saved searches
Use saved searches to filter your results more quickly
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
Java library to detect files’ MIME types
License
overview/mime-types
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Sign In Required
Please sign in to use Codespaces.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
Git stats
Files
Failed to load latest commit information.
README.md
Ever see «application/octet-stream» or «text/plain» or «text/html»? Those are called MIME types. («MIME» stands for Multi-purpose Internet Mail Extensions.)
If your Java program has files and needs to figure out their MIME types, this library will help.
import org.overviewproject.mime_types.MimeTypeDetector // . File file = new File("foo.txt"); MimeTypeDetector detector = new MimeTypeDetector(); String mimeType = detector.detectMimeType(file); // "text/plain" // . or . InputStream stream = new ByteArrayInputStream("words".getBytes("utf-8")) String mimeType = detector.detectMimeType("filename", stream); // "text/plain"
No library can figure out MIME types perfectly. But there’s a standard, called shared-mime-info. This library follows its algorithm to the letter.
You need two things to detect a file’s type:
The bytes aren’t always needed; for speed, you can pass a callback instead of the actual bytes, and this library will only invoke the callback when it’s absolutely necessary. There’s an async version, too.
For a method that matches the files you have, read the MimeTypeDetector docs.
Big thanks to Medsea Business Solutions S.L. for most of this code. I merely adjusted the API. (The original project at http://sourceforge.net/p/mime-util/ seems to be dead.)
About
Java library to detect files’ MIME types
Получение Mime-типа файла в Java
В этом руководстве мы рассмотрим различные стратегии получения файлов MIME-типов. Мы рассмотрим способы расширения типов MIME, доступных для стратегий, где это применимо.
Мы также укажем, где мы должны отдавать предпочтение одной стратегии перед другой.
2. Использование Java 7
Начнем с Java 7, которая предоставляет методFiles.probeContentType(path) для разрешения типа MIME:
@Test public void whenUsingJava7_thenSuccess() < Path path = new File("product.png").toPath(); String mimeType = Files.probeContentType(path); assertEquals(mimeType, "image/png"); >
Этот метод использует установленные реализацииFileTypeDetector для проверки типа MIME. Он вызываетprobeContentType каждой реализации для определения типа.
Теперь, если файл распознается любой из реализаций, возвращается тип содержимого. Однако, если этого не происходит, вызывается системный детектор типов файлов по умолчанию.
Однако реализации по умолчанию зависят от ОС и могут дать сбой в зависимости от ОС, которую мы используем.
В дополнение к этому, также важно отметить, что стратегия потерпит неудачу, если файл отсутствует в файловой системе. Более того, если у файла нет расширения, это приведет к ошибке.
3. ИспользуяURLConnection
URLConnection предоставляет несколько API-интерфейсов для определения типов файлов MIME. Давайте кратко рассмотрим каждый из них.
3.1. ИспользуяgetContentType()
Мы можем использовать методgetContentType() дляURLConnection для получения MIME-типа файла:
@Test public void whenUsingGetContentType_thenSuccess()< File file = new File("product.png"); URLConnection connection = file.toURL().openConnection(); String mimeType = connection.getContentType(); assertEquals(mimeType, "image/png"); >
Однако основным недостатком этого подхода является то, чтоit’s very slow.
3.2. ИспользуяguessContentTypeFromName()
Затем давайте посмотрим, как мы можем использоватьguessContentTypeFromName() для этой цели:
@Test public void whenUsingGuessContentTypeFromName_thenSuccess()< File file = new File("product.png"); String mimeType = URLConnection.guessContentTypeFromName(file.getName()); assertEquals(mimeType, "image/png"); >
Этот метод использует внутренние отFileNameMap доresolve the MIME type from the extension.
У нас также есть возможность использовать вместо этогоguessContentTypeFromStream(), который использует первые несколько символов входного потока для определения типа.
3.3. ИспользуяgetFileNameMap ()
Более быстрый способ получить тип MIME с помощьюURLConnection — использовать методgetFileNameMap():
@Test public void whenUsingGetFileNameMap_thenSuccess()< File file = new File("product.png"); FileNameMap fileNameMap = URLConnection.getFileNameMap(); String mimeType = fileNameMap.getContentTypeFor(file.getName()); assertEquals(mimeType, "image/png"); >
Метод возвращает таблицу типов MIME, используемых всеми экземплярамиURLConnection.. Эта таблица затем используется для определения типа входного файла.
Встроенная таблица типов MIME очень ограничена, когда дело доходит доURLConnection.
По умолчанию файлthe class uses content-types.properties вJRE_HOME/lib. We can, however, extend it, by specifying a user-specific table using the content.types.user.table property:
System.setProperty("content.types.user.table","");
4. ИспользуяMimeTypesFileTypeMap
MimeTypesFileTypeMap разрешает типы MIME с помощью расширения файла. Этот класс поставляется с Java 6 и, следовательно, очень удобен, когда мы работаем с JDK 1.6.
Теперь посмотрим, как его использовать:
@Test public void whenUsingMimeTypesFileTypeMap_thenSuccess() < File file = new File("product.png"); MimetypesFileTypeMap fileTypeMap = new MimetypesFileTypeMap(); String mimeType = fileTypeMap.getContentType(file.getName()); assertEquals(mimeType, "image/png"); >
Здесь мы можем передать имя файла или сам экземплярFile в качестве параметра функции. Однако функция с экземпляромFile в качестве параметра внутренне вызывает перегруженный метод, который принимает имя файла в качестве параметра.
Внутри этот метод ищет файл с именемmime.types для разрешения типа. Очень важно отметить, что метод ищет файл в определенном порядке:
- Программно добавленные записи в экземплярMimetypesFileTypeMap
- .mime.types в домашнем каталоге пользователя
- /lib/mime.types
- ресурсы с именемMETA-INF/mime.types
- ресурс с именемMETA-INF/mimetypes.default (обычно находится только в файлеactivation.jar)
Однако, если файл не найден, в качестве ответа будет возвращенapplication/octet-stream.
5. Использование jMimeMagic
jMimeMagic — это библиотека с ограниченной лицензией, которую мы можем использовать для получения MIME-типа файла.
Начнем с настройки зависимости Maven:
net.sf.jmimemagic jmimemagic 0.1.5
Мы можем найти последнюю версию этой библиотеки наMaven Central.
Далее мы узнаем, как работать с библиотекой:
@Test public void whenUsingJmimeMagic_thenSuccess() < File file = new File("product.png"); Magic magic = new Magic(); MagicMatch match = magic.getMagicMatch(file, false); assertEquals(match.getMimeType(), "image/png"); >
Эта библиотека может работать с потоком данных и, следовательно, не требует наличия файла в файловой системе.
6. Использование Apache Tika
Apache Tika — это набор инструментов, который обнаруживает и извлекает метаданные и текст из различных файлов. Он имеет богатый и мощный API и поставляется сtika-core, которые мы можем использовать для определения MIME-типа файла.
Начнем с настройки зависимости Maven:
org.apache.tika tika-core 1.18
Затем мы воспользуемся методомdetect() для определения типа:
@Test public void whenUsingTika_thenSuccess() < File file = new File("product.png"); Tika tika = new Tika(); String mimeType = tika.detect(file); assertEquals(mimeType, "image/png"); >
Библиотека использует магические маркеры в префиксе потока для разрешения типов.
7. Заключение
В этой статье мы рассмотрели различные стратегии получения файла MIME-типа. Кроме того, мы также проанализировали компромиссы подходов. Мы также указали сценарии, в которых мы должны отдавать предпочтение одной стратегии над другой.
Полный исходный код, который используется в этой статье, как всегда доступенover at GitHub.
Получение типа Mime файла в Java
В этом уроке мы рассмотрим различные стратегии получения MIME-типов файлов. Мы рассмотрим способы расширения типов MIME, доступных для стратегий, где это применимо.
Мы также покажем, где следует отдавать предпочтение одной стратегии перед другой.
2. Использование Java 7
Начнем с Java 7 – которая предоставляет метод Files.probeContentType(path) для разрешения типа MIME:
@Test public void whenUsingJava7_thenSuccess() < Path path = new File("product.png").toPath(); String mimeType = Files.probeContentType(path); assertEquals(mimeType, "image/png"); >
Этот метод использует установленные реализации FileTypeDetector для проверки типа MIME. Он вызывает probeContentType каждой реализации для разрешения типа.
Теперь, если файл распознается любой из реализаций, возвращается тип содержимого. Однако если этого не происходит, вызывается системный детектор типов файлов по умолчанию.
Однако реализации по умолчанию зависят от ОС и могут завершиться неудачей в зависимости от используемой ОС.
В дополнение к этому важно также отметить, что стратегия потерпит неудачу, если файл не будет присутствовать в файловой системе. Кроме того, если файл не имеет расширения, это приведет к сбою.
3. Использование URLConnection
URLConnection предоставляет несколько API – интерфейсов для обнаружения типов MIME файла. Давайте кратко рассмотрим каждый из них.
3.1. Использование getContentType()
Мы можем использовать getContentType() метод URLConnection для получения MIME-типа файла:
@Test public void whenUsingGetContentType_thenSuccess()< File file = new File("product.png"); URLConnection connection = file.toURL().openConnection(); String mimeType = connection.getContentType(); assertEquals(mimeType, "image/png"); >
Однако основным недостатком этого подхода является то, что он очень медленный .
3.2. Использование guessContentTypeFromName()
Далее давайте посмотрим, как мы можем использовать guessContentTypeFromName() для этой цели:
@Test public void whenUsingGuessContentTypeFromName_thenSuccess()< File file = new File("product.png"); String mimeType = URLConnection.guessContentTypeFromName(file.getName()); assertEquals(mimeType, "image/png"); >
Этот метод использует внутреннюю карту FileName Map для разрешения типа MIME из расширения .
У нас также есть возможность использовать guessContentTypeFromStream() вместо этого, который использует первые несколько символов входного потока, чтобы определить тип.
3.3. Использование getFileNameMap()
Более быстрый способ получить тип MIME с помощью URLConnection – это использовать метод getFileNameMap() :
@Test public void whenUsingGetFileNameMap_thenSuccess()< File file = new File("product.png"); FileNameMap fileNameMap = URLConnection.getFileNameMap(); String mimeType = fileNameMap.getContentTypeFor(file.getName()); assertEquals(mimeType, "image/png"); >
Метод возвращает таблицу типов MIME, используемых всеми экземплярами URLConnection. Эта таблица затем используется для разрешения типа входного файла.
Встроенная таблица типов MIME очень ограничена, когда речь заходит о URLConnection .
По умолчанию класс использует content-types.properties файл в JRE_HOME/lib . Однако мы можем расширить его, указав пользовательскую таблицу с помощью свойства content.types.user.table :
System.setProperty("content.types.user.table","");
4. Использование MimetypesFileTypeMap
MimetypesFileTypeMap разрешает типы MIME с помощью расширения файла. Этот класс поставляется с Java 6 и, следовательно, очень удобен при работе с JDK 1.6.
Теперь давайте посмотрим, как его использовать:
@Test public void whenUsingMimeTypesFileTypeMap_thenSuccess() < File file = new File("product.png"); MimetypesFileTypeMap fileTypeMap = new MimetypesFileTypeMap(); String mimeType = fileTypeMap.getContentType(file.getName()); assertEquals(mimeType, "image/png"); >
Здесь мы можем либо передать имя файла, либо сам экземпляр File в качестве параметра функции. Однако функция с File instance в качестве параметра внутренне вызывает перегруженный метод, который принимает имя файла в качестве параметра.
Внутренне этот метод ищет файл с именем Внутренне этот метод ищет файл с именем для разрешения типа. Очень важно отметить, что метод ищет файл в определенном порядке:
- Программно добавленные записи в экземпляр MimetypesFileTypeMap
- . mime.types в домашнем каталоге пользователя
- /lib/mime.types
- ресурсы с именем META-INF/mime.types
- ресурс с именем META-INF/mimetypes.default (обычно встречается только в activation.jar файл)
Однако, если файл не найден, он вернет application/octet-stream в качестве ответа.
5. Использование jMimeMagic
jMimeMagic – это ограниченно лицензированная библиотека, которую мы можем использовать для получения типа MIME файла.
Давайте начнем с настройки зависимости Maven:
net.sf.jmimemagic jmimemagic 0.1.5
Мы можем найти последнюю версию этой библиотеки на Maven Central .
Далее мы рассмотрим, как работать с библиотекой:
@Test public void whenUsingJmimeMagic_thenSuccess() < File file = new File("product.png"); Magic magic = new Magic(); MagicMatch match = magic.getMagicMatch(file, false); assertEquals(match.getMimeType(), "image/png"); >
Эта библиотека может работать с потоком данных и, следовательно, не требует присутствия файла в файловой системе.
6. Использование Apache Tika
Apache Tika – это набор инструментов, который обнаруживает и извлекает метаданные и текст из различных файлов. Он имеет богатый и мощный API и поставляется с tika-core , который мы можем использовать для обнаружения типа MIME файла.
Давайте начнем с настройки зависимости Maven:
org.apache.tika tika-core 1.18
Далее мы будем использовать метод detect() для разрешения типа:
@Test public void whenUsingTika_thenSuccess() < File file = new File("product.png"); Tika tika = new Tika(); String mimeType = tika.detect(file); assertEquals(mimeType, "image/png"); >
Библиотека полагается на магические маркеры в префиксе потока для разрешения типа.
7. Заключение
В этой статье мы рассмотрели различные стратегии получения файла типа MIME. Кроме того, мы также проанализировали компромиссы подходов. Мы также указали сценарии, в которых мы должны отдавать предпочтение одной стратегии перед другой.
Полный исходный код , используемый в этой статье, доступен на GitHub , как всегда.