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

1. Общ преглед

В този урок ще разгледаме различни стратегии за получаване на MIME типове на файл. Ще разгледаме начини за разширяване на наличните за стратегиите MIME типове, където е приложимо.

Също така ще посочим къде трябва да предпочитаме едната стратегия пред другата.

2. Използване на Java 7

Нека започнем с Java 7 - който предоставя метода Files.probeContentType (път) за разрешаване на типа 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"); }

Този метод използва вътрешната FileNameMap за разрешаване на типа MIME от разширението .

Също така имаме възможността да използваме thinkContentTypeFromStream () вместо това, което използва първите няколко знака от входния поток, за да определим типа.

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 / ИЪ . Можем обаче да го разширим, като посочим специфична за потребителя таблица, използвайки свойството 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 instance като параметър обаче вътрешно извиква претоварения метод, който приема името на файла като параметър.

Вътрешно този метод търси файл, наречен mime.types за разделителна способност на типа. Много е важно да се отбележи, че методът търси файла в определен ред:

  1. Програмно добавени записи към екземпляра MimetypesFileTypeMap
  2. . mime.types в домашната директория на потребителя
  3. /lib/mime.types
  4. ресурси с име META-INF / mime.types
  5. ресурс с име META-INF / mimetypes.default (обикновено се намира само във файла activation.jar )

Ако обаче не бъде намерен файл, той ще върне приложение / октет-поток като отговор.

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, както винаги.