Рубрики
Без рубрики

Получение типа Mime файла в Java

Обзор различных способов получения типа MIME файла

Автор оригинала: baeldung.

1. Обзор

В этом уроке мы рассмотрим различные стратегии получения 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 в качестве параметра внутренне вызывает перегруженный метод, который принимает имя файла в качестве параметра.

Внутренне этот метод ищет файл с именем Внутренне этот метод ищет файл с именем для разрешения типа. Очень важно отметить, что метод ищет файл в определенном порядке:

  1. Программно добавленные записи в экземпляр MimetypesFileTypeMap
  2. . mime.types в домашнем каталоге пользователя
  3. /lib/mime.types
  4. ресурсы с именем META-INF/mime.types
  5. ресурс с именем 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 , как всегда.