Вопрос-ответ

How to get a file's Media Type (MIME type)?

Как получить тип носителя файла (MIME-тип)?

Как получить тип носителя (MIME-тип) из файла с помощью Java? До сих пор я пробовал JMimeMagic и Mime-Util. Первый выдал мне исключения из памяти, второй не закрывает свои потоки должным образом.

Как бы вы исследовали файл, чтобы определить его фактический тип (не только на основе расширения)?

Переведено автоматически
Ответ 1

В Java 7 теперь вы можете просто использовать Files.probeContentType(path).

Ответ 2

К сожалению,

mimeType = file.toURL().openConnection().getContentType();

не работает, поскольку при таком использовании URL файл остается заблокированным, так что, например, его невозможно восстановить.

Однако у вас есть это:

mimeType= URLConnection.guessContentTypeFromName(file.getName());

а также следующее, преимущество которого заключается не только в использовании расширения файла, но и в ознакомлении с содержимым

InputStream is = new BufferedInputStream(new FileInputStream(file));
mimeType = URLConnection.guessContentTypeFromStream(is);
//...close stream

Однако, как указано в комментарии выше, встроенная таблица mime-типов довольно ограничена, не включая, например, MSWord и PDF. Итак, если вы хотите обобщить, вам нужно выйти за рамки встроенных библиотек, используя, например, Mime-Util (это отличная библиотека, использующая как расширение файла, так и содержимое).

Ответ 3

С Apache Tika вам нужно всего три строки кода:

File file = new File("/path/to/file");
Tika tika = new Tika();
System.out.println(tika.detect(file));

Если у вас есть groovy console, просто вставьте и запустите этот код, чтобы поиграть с ним:

@Grab('org.apache.tika:tika-core:1.14')
import org.apache.tika.Tika;

def tika = new Tika()
def file = new File("/path/to/file")
println tika.detect(file)

Имейте в виду, что его API богаты, он может анализировать "что угодно". Начиная с tika-core 1.14, у вас есть:

String  detect(byte[] prefix)
String detect(byte[] prefix, String name)
String detect(File file)
String detect(InputStream stream)
String detect(InputStream stream, Metadata metadata)
String detect(InputStream stream, String name)
String detect(Path path)
String detect(String name)
String detect(URL url)

Смотрите apidocs для получения дополнительной информации.

Ответ 4

JAF API является частью JDK 6. Посмотрите на javax.activation пакет.

Наиболее интересными классами являются javax.activation.MimeType - фактический держатель MIME-типа - и javax.activation.MimetypesFileTypeMap - класс, экземпляр которого может разрешать MIME-тип как строку для файла:

String fileName = "/path/to/file";
MimetypesFileTypeMap mimeTypesMap = new MimetypesFileTypeMap();

// only by file name
String mimeType = mimeTypesMap.getContentType(fileName);

// or by actual File instance
File file = new File(fileName);
mimeType = mimeTypesMap.getContentType(file);
java