Как проверить, что содержимое файла действительно изображение

Для определения реального типа файла на основе содержимого файла (а не расширения) я использую apache Tika.

Я написал следующий код:

    InputStream theInputStream = new FileInputStream("D:\\video.mp4");
    try (InputStream is = theInputStream;
            BufferedInputStream bis = new BufferedInputStream(is);) {
        AutoDetectParser parser = new AutoDetectParser();
        Detector detector = parser.getDetector();
        Metadata md = new Metadata();
        MediaType mediaType = detector.detect(bis, md);
        mediaType.getBaseType().compareTo(MediaType))
        System.out.println(mediaType);
    }

этот код выводит image/jpeg,

Это правда, потому что я изменил расширение файла.
Теперь я хочу проверить, что файл является изображением.
Я не могу найти enum в классе MediaType.
Теперь я знаю только следующее:

mediaType.toString().startsWith("image");

Но этот код выглядит некрасиво.
Можете ли вы посоветовать лучшее решение?

2 ответа

Вы увидите, что MediaType имеет getType() и getSubtype() метод. То, что вы ищете, это тип (т.е. "image/*"). Подтип в этом случае будет "jpeg",

Итак, ваш тест должен быть:

if (mediaType.getType().equals("image")) {
   // Deal with image
}

Что ж, AFAIK - единственный способ проверить немного более надежно, является ли файл настоящим gif, png или каким-либо другим файлом, который вам нужно проверить на уникальную "волшебную" последовательность байтов, которую имеет каждый из этих файлов.

Если вы используете Java 7, вы можете воспользоваться этим решением здесь: https://odoepner.wordpress.com/2013/07/29/transparently-improve-java-7-mime-type-recognition-with-apache-tika/

Я не автор этого и не проверял!

Другие вопросы по тегам