1. Description du problème
Pendant le développement du projet, nous rencontrons souvent un problème de téléchargement de fichiers, qui est le format de l'image à obtenir. Dans de nombreux cas, de nombreuses personnes utilisent le nom du suffixe pour juger, comme indiqué ci-dessous.
if (filename.endswith (". png") || filename.endswith (". jpg")) {// Enregistrer l'image} else {lancer une nouvelle ioException ("Format de fichier d'erreur!");}Cependant, cette méthode est assez peu fiable. Nous pouvons essayer de télécharger le fichier zip, le fichier RMVB, CSS, JS pour modifier le nom de suffixe JPG ou PNG, ou le télécharger sur le serveur, ce qui fait apparaître les données sales sur notre serveur. De plus, pour certains fichiers d'image, s'ils sont modifiés à la mauvaise extension, certains navigateurs peuvent ne pas être en mesure d'afficher l'image.
2. Solution
Dans les systèmes informatiques, les fichiers de type multimédia ont [des identifiants] et la fermeture éclair et les images elles-mêmes appartiennent à des fichiers multimédias, afin que nous puissions déterminer si les images sont légales grâce à l'encodage et au décodage.
1. Méthode de jugement et de marquage
booléen statique privé ISBMP (byte [] buf) {byte [] markbuf = "bm" .getBytes (); // Les deux premiers octets du BMP Image File Return Compare (BUF, MarkBuf); } booléen statique privé iSicon (byte [] buf) {octet [] markbuf = {0, 0, 1, 0, 1, 0, 32, 32}; Return Compare (BUF, Markbuf); } private static boolean iswebp (byte [] buf) {byte [] markbuf = "riff" .getBytes (); // WebP Image Identifier return compare (buf, markbuf); } private static boolean isgif (byte [] buf) {byte [] markbuf = "gif89a" .getBytes (); // gif identifiant if (comparer (buf, markbuf)) {return true; } markbuf = "gif87a" .getBytes (); // gif identifiant if (comparer (buf, markbuf)) {return true; } return false; } private static boolean ispng (byte [] buf) {byte [] markbuf = {(byte) 0x89,0x50,0x4e, 0x47,0x0d, 0x0a, 0x1a, 0x0a}; // png identifiant // new String (buf) .Indexof ("png")> 0 // Cette méthode peut également être utilisée pour retourner comparer (buf, markbuf); } private static boolean isjpegheader (byte [] buf) {byte [] markbuf = {(byte) 0xff, (byte) 0xd8}; // JPEG Start Character Return Compare (BUF, MarkBuf); } private static boolean isjpegfooter (byte [] buf) // jpeg Ending Caractor {byte [] markbuf = {(byte) 0xff, (byte) 0xd9}; Return Compare (BUF, Markbuf); }2. Méthodes de base
/ ** * Obtenez le mimetype du fichier * @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; } / ** * Lire le type de fichier * @param nom de fichier * @return * @throws ioException * / private static string ReadType (String filename) lève ioException {fileInputStream fis = null; essayez {fichier f = nouveau fichier (nom de fichier); if (! f.exists () || f.isDirectory () || f.length () <8) {Throw New ioException ("Le fichier [" + f.getabsolutepath () + "] n'est pas l'image!"); } fis = new FileInputStream (f); octet [] bufheders = readInputStreamat (Fis, 0,8); if (isjpegheader (bufheders)) {long skiplength = f.length () - 2-8; // La première fois que j'ai lu 8 octets, j'ai donc besoin de soustraire l'octet [] buffooters = readInputStreamat (Fis, skiplength, 2); if (isjPegFooter (buffooters)) {return "jPEG"; }} if (ispng (bufheders)) {return "png"; } if (isgif (bufHeaders)) {return "gif"; } if (isWebp (bufHeaders)) {return "webp"; } if (isBmp (bufheders)) {return "bmp"; } if (isicon (bufheders)) {return "ico"; } Jetez une nouvelle ioException ("Le format de l'image est inconnu!"); } catch (filenotfoundException e) {throw e; } enfin {try {if (fis! = null) fis.close (); } Catch (exception e) {}}} / ** * Comparaison de cohérence de la marque * @param buf mark à détecter * @param markbuf identificateur byte byte * @return return false mark Siglematch * / private static boolean compare (byte [] buf, byte [] markbuf) {pour (int i = 0; i <Markbuf Markbuf [i]; octet a = buf [i]; if (a! = b) {return false; }} return true; } / ** * * @Param Fis Intary Stream Object * @param Skiplength Skip Position Longueur * @param Longueur Longueur pour lire * @return Byte Array * @throws ioexception * / private static byte [] readInputStreamat (fileInputStream fis, long skiplength, intylong) lance ioException {byte [] buf = new byte [longueur]; fis.skip (skiplength); // int read = fis.read (buf, 0, longueur); retour Buf; }3. Code de test
Test normal
classe publique ImageType {public static void main (String [] args) {String filename = "oschina.jpg"; String type = getMiMetype (nom de fichier); System.out.println (type); }} Sortir
image / jpeg
Modifier le test d'extension
① Modifier oschina.jpeg à oschina.png
②copy oschina.png pour supprimer l'extension
classe publique ImageType {public static void main (String [] args) {String filename = "oschina.png"; String type = getMiMetype (nom de fichier); System.out.println (type); filename = "oschina"; type = getMiMetype (nom de fichier); System.out.println (type); }} Sortir
image / jpeg
image / jpeg
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.