- java-file-mime-type
- 2. Using Java 7
- 3. Using URLConnection
- 3.1. Using getContentType()
- 3.2. Using guessContentTypeFromName()
- 3.3. Using getFileNameMap()
- 4. Using MimeTypesFileTypeMap
- 5. Using jMimeMagic
- 6. Using Apache Tika
- 7. Conclusion
- Получение Mime-типа файла в Java
- 2. Использование Java 7
- 3. ИспользуяURLConnection
- 3.1. ИспользуяgetContentType()
- 3.2. ИспользуяguessContentTypeFromName()
- 3.3. ИспользуяgetFileNameMap ()
- 4. ИспользуяMimeTypesFileTypeMap
- 5. Использование jMimeMagic
- 6. Использование Apache Tika
- 7. Заключение
- Getting Mime type in Java
- Using Java 7 Files .probeContentType
- Using With URLConnection getContentType
- Using URLConnection guessContentTypeFromName
- Using URLConnection getFileNameMap
- Output
java-file-mime-type
In this tutorial, we’ll take a look at various strategies for getting MIME types of a file. We’ll look at ways to extend the MIME types available to the strategies, wherever applicable.
We’ll also point out where we should favor one strategy over the other.
2. Using Java 7
Let’s start with Java 7 – which provides the method Files.probeContentType(path) for resolving the MIME type:
@Test public void whenUsingJava7_thenSuccess() < Path path = new File("product.png").toPath(); String mimeType = Files.probeContentType(path); assertEquals(mimeType, "image/png"); >
This method makes use of the installed FileTypeDetector implementations to probe the MIME type. It invokes the probeContentType of each implementation to resolve the type.
Now, if the file is recognized by any of the implementations, the content type is returned. However, if that doesn’t happen, a system-default file type detector is invoked.
However, the default implementations are OS specific and might fail depending on the OS that we are using.
In addition to that, it’s also important to note that the strategy will fail if the file isn’t present in the filesystem. Furthermore, if the file doesn’t have an extension, it will result in failure.
3. Using URLConnection
URLConnection provides several APIs for detecting MIME types of a file. Let’s briefly explore each of them.
3.1. Using getContentType()
We can use getContentType() method of URLConnection to retrieve a file’s MIME type:
@Test public void whenUsingGetContentType_thenSuccess()< File file = new File("product.png"); URLConnection connection = file.toURL().openConnection(); String mimeType = connection.getContentType(); assertEquals(mimeType, "image/png"); >
However, a major drawback of this approach is that it’s very slow.
3.2. Using guessContentTypeFromName()
Next, let’s see how we can make use of the guessContentTypeFromName() for the purpose:
@Test public void whenUsingGuessContentTypeFromName_thenSuccess()< File file = new File("product.png"); String mimeType = URLConnection.guessContentTypeFromName(file.getName()); assertEquals(mimeType, "image/png"); >
This method makes use of the internal FileNameMap to resolve the MIME type from the extension.
We also have the option of using guessContentTypeFromStream() instead, which uses the first few characters of the input stream, to determine the type.
3.3. Using getFileNameMap()
A faster way to obtain the MIME type using URLConnection is using the getFileNameMap() method:
@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"); >
The method returns the table of MIME types used by all instances of URLConnection. This table is then used to resolve the input file type.
The built-in table of MIME types is very limited when it comes to URLConnection.
By default, the class uses content-types.properties file in 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. Using MimeTypesFileTypeMap
MimeTypesFileTypeMap resolves MIME types by using file’s extension. This class came with Java 6, and hence comes very handy when we’re working with JDK 1.6.
Now let’s see how to use it:
@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"); >
Here, we can either pass the name of the file or the File instance itself as the parameter to the function. However, the function with File instance as the parameter internally calls the overloaded method that accepts the filename as the parameter.
Internally, this method looks up a file called mime.types for the type resolution. It’s very important to note that the method searches for the file in a specific order:
- Programmatically added entries to the MimetypesFileTypeMap instance
- .mime.types in the user’s home directory
- /lib/mime.types
- resources named META-INF/mime.types
- resource named META-INF/mimetypes.default (usually found only in the activation.jar file)
However, if no file is found, it will return application/octet-stream as the response.
5. Using jMimeMagic
jMimeMagic is a restrictively licensed library that we can use to obtain the MIME type of a file.
Let’s start by configuring the Maven dependency:
net.sf.jmimemagic jmimemagic 0.1.5
We can find the latest version of this library on Maven Central.
Next, we’ll explore how to work with the library:
@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"); >
This library can work with a stream of data and hence doesn’t require the file to be present in the file system.
6. Using Apache Tika
Apache Tika is a toolset that detects and extracts metadata and text from a variety of files. It has a rich and powerful API and comes with tika-core which we can make use of, for detecting MIME type of a file.
Let’s begin by configuring the Maven dependency:
org.apache.tika tika-core 1.18
Next, we’ll make use of the detect() method to resolve the type:
@Test public void whenUsingTika_thenSuccess() < File file = new File("product.png"); Tika tika = new Tika(); String mimeType = tika.detect(file); assertEquals(mimeType, "image/png"); >
The library relies on magic markers in the stream prefix, for type resolution.
7. Conclusion
In this article, we’ve looked at the various strategies of obtaining the MIME type of a file. Furthermore, we have also analyzed the tradeoffs of the approaches. We have also pointed out the scenarios where we should favor one strategy over the other.
The full source code that is used in this article is available over at GitHub, as always.
Получение 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.
Getting Mime type in Java
In this tutorial, I am showing how to get mime type of a file in java using Java 7 Files and URLConnection class.
You can select right one from the below listed, which suits your needs.
Using Java 7 Files .probeContentType
// using java 7 probeContentType String mimeType = Files.probeContentType(path); System.out.println(mimeType);
Using With URLConnection getContentType
// getContentType URLConnection connection = file.toURL().openConnection(); System.out.println(connection.getContentType());
Using URLConnection guessContentTypeFromName
// guessContentTypeFromName System.out.println(URLConnection.guessContentTypeFromName(file.getName()));
Using URLConnection getFileNameMap
// getFileNameMap System.out.println(URLConnection.getFileNameMap().getContentTypeFor(file.getName()));
You can find the complete example of finding mimes type of a file below with all the above described ways.
package com.javatips; import java.io.File; import java.io.IOException; import java.net.URLConnection; import java.nio.file.Files; import java.nio.file.Path; public class MimeExample public static void main(String[] args) throws IOException File file = new File("java.png"); Path path = file.toPath(); // using java 7 probeContentType String mimeType = Files.probeContentType(path); System.out.println(mimeType); // getContentType URLConnection connection = file.toURL().openConnection(); System.out.println(connection.getContentType()); // guessContentTypeFromName System.out.println(URLConnection.guessContentTypeFromName(file.getName())); // getFileNameMap System.out.println(URLConnection.getFileNameMap().getContentTypeFor(file.getName())); > >
Output
image/png image/png image/png image/png