1. Описание проблемы
Во время разработки проекта мы часто сталкиваемся с проблемой загрузки файлов, которая является форматом изображения для получения. Во многих случаях многие люди используют название суффикса для суждения, как показано ниже.
if (filename.endswith (". png") || filename.endswith (". jpg")) {// Сохранить изображение} else {бросить новое ioexception ("Формат файла ошибки!");}Тем не менее, этот метод довольно ненадежный. Мы можем попытаться загрузить ZIP -файл, RMVB -файл, CSS, JS, чтобы изменить имя суффикса JPG или PNG или загрузить его на сервер, что приводит к появлению грязных данных на нашем сервере. Кроме того, для некоторых файлов изображений, если они изменены в неправильном расширении, некоторые браузеры могут не иметь возможности отображать изображение.
2. Решение
В компьютерных системах файлы типа мультимедиа имеют [идентификаторы], а Zip и Pictures сами принадлежат медиа -файлам, поэтому мы можем определить, являются ли картинки законными посредством кодирования и декодирования.
1. Метод суждения и маркировки
Частный статический логический ISBMP (byte [] buf) {byte [] markbuf = "bm" .getbytes (); // первые два байта файла изображения BMP return compare (buf, markbuf); } private static boolean isicon (byte [] buf) {byte [] markbuf = {0, 0, 1, 0, 1, 0, 32, 32}; return Compare (Buf, Markbuf); } Частный статический логический ISWEBP (byte [] buf) {byte [] markbuf = "riff" .getbytes (); // идентификатор изображения webp return compare (buf, markbuf); } Частный статический логический ISGIF (byte [] buf) {byte [] markbuf = "gif89a" .getbytes (); // идентификатор GIF if (compare (buf, markbuf)) {return true; } markbuf = "gif87a" .getbytes (); // идентификатор GIF if (compare (buf, markbuf)) {return true; } вернуть false; } Частный статический логический ispng (byte [] buf) {byte [] markbuf = {(byte) 0x89,0x50,0x4e, 0x47,0x0d, 0x0a, 0x1a, 0x0a}; // идентификатор png // new String (buf) .IndexOf ("png")> 0 // Этот метод также можно использовать для возврата сравнения (buf, markbuf); } Частный статический логический iSjpegheader (byte [] buf) {byte [] markbuf = {(byte) 0xff, (byte) 0xd8}; // jpeg start atervice return compare (buf, markbuf); } Частный статический логический подразделение isJpegfooter (byte [] buf) // jpeg ending символ {byte [] markbuf = {(byte) 0xff, (byte) 0xd9}; return Compare (Buf, Markbuf); }2. Основные методы
/ ** * Получить mimeType файла * @param filename * @return */ private static String getMiMeType (String FileName) {try {String mimeType = readtype (filename); return string.format ("image/%s", mimeType); } catch (ioException e) {e.printstackTrace (); } return null; } / ** * Читать тип файла * @param filename * @return * @throws ioexception * / private static String readtype (String FileName) Throws ioException {fileInputStream fis = null; try {file f = new File (имя файла); if (! f.exists () || f.isdirectory () || f.length () <8) {бросить новое ioexception ("file ["+f.getabsolutepath ()+"] не изображение!"); } fis = new FileInputStream (f); byte [] bufheaders = readinputstreamat (fis, 0,8); if (isjpegheader (bufheaders)) {long skiplength = f.length ()-2-8; // В первый раз, когда я прочитал 8 байтов, поэтому мне нужно вычесть Byte [] Buffooters = ReadInputStreamat (FIS, Skiplength, 2); if (isjpegfooter (buffooters)) {return "jpeg"; }} if (ispng (bufheaders)) {return "png"; } if (isgif (bufheaders)) {return "gif"; } if (iswebp (bufheaders)) {return "webp"; } if (isbmp (bufheaders)) {return "bmp"; } if (isicon (bufheaders)) {return "ico"; } бросить новое ioException («Формат изображения не совсем!»); } catch (filenotfoundexception e) {throw e; } наконец {try {if (fis! = null) fis.close (); } catch (Exception e) {}}} / *** Сравнение согласованности отмечена* @param buf Mark, чтобы быть обнаруженным* @param markbuf идентификатор байтового массива* @return return false mance ncise* / private static boolean compare (byte [] buf, byte [] markbuf) {for i = 0; i <markbu. Markbuf [i]; byte a = buf [i]; if (a! = b) {вернуть false; }} вернуть true; } / ***** @param fis входной поток объект* @param skiplength delon length* @param длина длины, чтобы прочитать* @return Byte Array* @throws ioexception* / private static byte [] readinputStreamat (fileInputStream fis, длинная длина скипла, int длина) throweexception {byte [] buf = new byte -gtine, int длина) throweexception {byte [] new byte -length, int длина); fis.skip (Skiplength); // int read = fis.read (buf, 0, длина); вернуть BUF; }3. Тестовый код
Нормальный тест
открытый класс ImageType {public static void main (string [] args) {string filename = "oschina.jpg"; String type = getMimeType (имя файла); System.out.println (type); }} Выход
Изображение/JPEG
Измените тест на расширение
① Измените Oschina.jpeg на Oschina.png
②copy oschina.png для удаления расширения
открытый класс ImageType {public static void main (string [] args) {string filename = "oschina.png"; String type = getMimeType (имя файла); System.out.println (type); filename = "oschina"; type = getMimeType (имя файла); System.out.println (type); }} Выход
Изображение/JPEG
Изображение/JPEG
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.