Как проверить, что содержимое файла действительно изображение
Для определения реального типа файла на основе содержимого файла (а не расширения) я использую 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/
Я не автор этого и не проверял!