Определить, является ли данный файл образом и допустимым образом определенного типа в java


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

Поэтому я реализовал наивную базовую проверку для файла

fileName.toLowerCase().endsWith(".jpg") || fileName.toLowerCase().endsWith(".jpeg")

Итак, если пользователь загрузил файл.png, этот файл был отклонен. Но потом пользователи поняли, что если они просто переименуют файл.png в файл.jpg, файл будет загружен.

Есть ли способ определить, является ли предоставленный файл допустимым изображением данного типа, используя только JAVA SDK без внешнего банки? (обратите внимание, что я все еще работаю с JDK6). Спасибо.

2 3

2 ответа:

Это должно быть относительно легко сделать некоторые наивные проверка отдельных фотку из ПНГ. Согласно Википедии , файлы JPEG всегда начинаются с FF D8. Однако PNGs, по-видимому, начинаются с 89 50, поэтому можно легко отличить их от простого чтения байта или двух из файла.

Я бы рекомендовал поискать форматы файлов наиболее важных типов изображений, чтобы убедиться, что нет какого-то другого основного, начинающегося с FF D8. Это кажется маловероятным однако.

Edit: JPEG, PNG, GIF, BMP и TIFF все, кажется, имеют магические значения в начале файлов, чтобы отличить их от других типов.

Декодировать файл в формате jpeg и посмотреть, вызывает ли он исключение или возвращает изображение?

Для этого можно использовать JDK ImageIO (http://docs.oracle.com/javase/6/docs/api/javax/imageio/ImageIO.html начните с получения ImageReader для jpeg, затем пусть этот читатель попытается прочитать изображение.