1. Problembeschreibung
Während der Projektentwicklung stoßen wir häufig auf ein Problem beim Hochladen von Dateien, bei dem das Bild des Bildes zu erhalten ist. In vielen Fällen verwenden viele Menschen den Suffix -Namen, um zu beurteilen, wie unten gezeigt.
if (Dateiname.endswith (". Png") || Dateiname.endswith (". JPG")) {// Speichern Sie das Bild} else {Wurf neuer IOException ("Fehlerdateiformat!");}Diese Methode ist jedoch recht unzuverlässig. Wir können versuchen, die ZIP -Datei, die RMVB -Datei, die CSS und die JS hochzuladen, um den Suffix -Namen JPG oder PNG zu ändern, oder sie auf den Server hochladen, wodurch schmutzige Daten auf unserem Server angezeigt werden. Bei einigen Bilddateien können einige Browser bei einigen Bilddateien möglicherweise nicht in der Lage sein, das Bild anzuzeigen.
2. Lösung
In Computersystemen haben Medientyp -Dateien [Bezeichner] und Zip und Bilder selbst gehören zu Mediendateien, damit wir bestimmen können, ob die Bilder durch Codierung und Dekodierung legal sind.
1. Methode zur Beurteilung und Markierung
private statische boolean isbmp (byte [] buf) {byte [] markbuf = "bm" .getBytes (); // die ersten beiden Bytes der BMP -Bilddatei Rückgabevergleich (buf, markbuf); } private statische boolean isicon (byte [] buf) {byte [] markbuf = {0, 0, 1, 0, 1, 0, 32, 32}; return compare (buf, markbuf); } private statische boolean isWebp (byte [] buf) {byte [] markbuf = "riff" .GetByTes (); // Webp Image Identifier Return Compare (buf, markbuf); } private statische boolean isgif (byte [] buf) {byte [] markbuf = "gif89a" .getBytes (); // Gif identifier if (compare (buf, markbuf)) {return true; } markbuf = "gif87a" .getBytes (); // Gif identifier if (compare (buf, markbuf)) {return true; } return false; } private statische boolean ispng (byte [] buf) {byte [] markbuf = {(byte) 0x89,0x50,0x4e, 0x47,0x0d, 0x0a, 0x1a, 0x0a}; // png identifier // new String (BUF) .Indexof ("png")> 0 // Diese Methode kann auch zum Rückgabereien verwendet werden (buf, markbuf); } private statische boolesche isjpegheader (byte [] buf) {byte [] markbuf = {(byte) 0xff, (byte) 0xd8}; // JPEG Start Character Return Compare (buf, markbuf); } private statische boolean isjpegfooter (byte [] buf) // JPEG Ending Zeichen {byte [] markbuf = {(byte) 0xff, (byte) 0xd9}; return compare (buf, markbuf); }2. Kernmethoden
/ ** * Erhalten Sie den Mimetyp der Datei * @param Dateiname * @return */ private statische String getMiMetype (String -Dateiname) {try {String mimetype = ReadType (Dateiname); return string.format ("Image/%s", Mimetype); } catch (ioException e) {e.printstacktrace (); } return null; } / ** * Dateityp lesen * @param Dateiname * @return * @throws ioException * / private statische String -ReadType (String -Dateiname) löscht IOException {FileInputStream fis = null aus; try {Datei f = neue Datei (Dateiname); if (! } fis = new FileInputStream (f); byte [] bufheaders = readInputStreamat (fis, 0,8); if (isjpegheader (bufheaders)) {Long Skiplength = f.Length ()-2-8; // Das erste Mal, dass ich 8 Bytes lese, muss ich Byte [] Buffooters = ReadInputStreamat (FIS, Skiplength, 2) subtrahieren; if (isjpegfooter (Buffoters)) {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"; } neue IOException werfen ("Das Bild des Bildes ist unkosten!"); } catch (FilenotFoundException e) {throw e; } endlich {try {if (fis! = null) fis.close (); } catch (Ausnahme e) {}}} / *** markieren Konsistenzvergleich* @param BUF Mark zu erfassen Markbuf [i]; Byte a = buf [i]; if (a! = b) {return false; }} return true; } / **** @param fis Eingangsstream -Objekt* @param sciplength überspringen Positionslänge* @param Länge zum Lesen* @return Byte Array* @Throws ioException* / privat statisches Byte [] ReadInputStreamat (FileInputStream FIS, Long Skiplength, INT Länge) lenkt IoException {byte [] buf = buf = buf = buf = buf = buf = buf = buf = buf = buf = buf. fis.skip (Skiplength); // int read = fis.read (buf, 0, Länge); BUF zurückgeben; }3. Testcode
Normaler Test
public class Imagetype {public static void main (String [] args) {String FileName = "Oschina.jpg"; String type = getMimetype (Dateiname); System.out.println (Typ); }} Ausgabe
Bild/JPEG
Erweiterungstest ändern
① ① oschina.jpeg an oschina.png modifizieren
②Copy oschina.png, um die Erweiterung zu löschen
public class Imagetype {public static void main (String [] args) {String FileName = "oschina.png"; String type = getMimetype (Dateiname); System.out.println (Typ); Dateiname = "Oschina"; type = getMimetype (Dateiname); System.out.println (Typ); }} Ausgabe
Bild/JPEG
Bild/JPEG
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.