1. Descrição do problema
Durante o desenvolvimento do projeto, geralmente encontramos um problema de fazer upload de arquivos, que é o formato da imagem a ser obtido. Em muitos casos, muitas pessoas usam o nome do sufixo para julgar, como mostrado abaixo.
if (filename.endswith (". png") || filename.endswith (".No entanto, esse método não é confiável. Podemos tentar fazer upload do arquivo ZIP, arquivo rmvb, css, js para modificar o nome do sufixo JPG ou PNG ou enviá -lo para o servidor, o que faz com que dados sujos apareçam em nosso servidor. Além disso, para alguns arquivos de imagem, se forem modificados para a extensão errada, alguns navegadores podem não ser capazes de exibir a imagem.
2. Solução
Nos sistemas de computadores, os arquivos de tipo de mídia possuem [identificadores] e as próprias zip e as próprias imagens pertencem a arquivos de mídia, para que possamos determinar se as imagens são legais por meio da codificação e decodificação.
1. Método de julgamento e marcação
private estático booleano ISBMP (byte [] buf) {byte [] markbuf = "bm" .getBytes (); // Os dois primeiros bytes do arquivo de imagem de imagem BMP compara (BUF, Markbuf); } isicon booleano estático privado (byte [] buf) {byte [] markbuf = {0, 0, 1, 0, 1, 0, 32, 32}; Return Compare (BUF, Markbuf); } private estático booleano iswebp (byte [] buf) {byte [] markbuf = "riff" .getBytes (); // Webp Image Identifier Return Compare (BUF, MarkBuf); } private estático booleano 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; } retornar false; } private estático booleano ispng (byte [] buf) {byte [] markbuf = {(byte) 0x89,0x50,0x4e, 0x47,0x0d, 0x0a, 0x1a, 0x0a}; // identificador png // new string (buf) .IndexOf ("png")> 0 // Este método também pode ser usado para retornar comparar (buf, markbuf); } private estático booleano isjpeGheader (byte [] buf) {byte [] markbuf = {(byte) 0xff, (byte) 0xd8}; // jpeg start caractere retorna de retorno (BUF, markbuf); } private estático booleano isjpegfooter (byte [] buf) // caractere final jpeg {byte [] markbuf = {(byte) 0xff, (byte) 0xd9}; Return Compare (BUF, Markbuf); }2. Métodos principais
/ ** * Obtenha o mimeType do arquivo * @param filename * @return */ string estática privada getMimetype (string filename) {try {string Mimetype = readType (nome do arquivo); return string.format ("Image/%s", Mimetype); } catch (ioexception e) {e.printStackTrace (); } retornar nulo; } / ** * Leia o tipo de arquivo * @param filename * @return * @throws ioexception * / string estática privada readtype (string filename) lança IoException {FileInputStream fis = null; tente {arquivo f = novo arquivo (nome do arquivo); if (! f.exists () || f.isdirectory () || f.length () <8) {lança nova ioexception ("o arquivo ["+f.getabsolutepath ()+"] não é imagem!"); } fis = new FileInputStream (f); byte [] bufheaders = readInputStreamat (fis, 0,8); if (isjpeGeGheader (bufheaders)) {long skiplength = f.length ()-2-8; // Na primeira vez em que li 8 bytes, então preciso subtrair o byte [] buffeoters = readinputStreamat (fis, skiplength, 2); if (isjpegfooter (buffeoters)) {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"; } lançar uma nova ioexception ("O formato da imagem é desconhecido!"); } catch (filenotfoundException e) {tiro e; } finalmente {tente {if (fis! = null) fis.close (); } catch (Exceção e) {}}} / *** Marque a comparação de consistência* @param buf marca a ser detectada* @param markbuf identificador Byte Array* @return return mark sigil incompatch* / private boolean compare (byte [] buf, byte [] markbuf) {para (int; Markbuf [i]; byte a = buf [i]; if (a! = b) {return false; }} retornar true; } / **** @param fis Objeto de fluxo de entrada* @param skiplength comprimento Comprimento da posição* @param Comprimento do comprimento para ler* @return byte Array* @THOWSoxeexception* / byte estático privado [] readinputStreamat (FileInputStream Fis, SkipLearn Long) [] LengthException; fis.skip (skiplength); // int read = fis.read (buf, 0, comprimento); retornar buf; }3. Código de teste
Teste normal
classe pública ImageType {public static void main (string [] args) {string filename = "Oschina.jpg"; String type = getMimetype (nome do arquivo); System.out.println (tipo); }} Saída
imagem/jpeg
Modifique o teste de extensão
① Modificar oschina.jpeg para oschina.png
②Copy Oschina.png para excluir a extensão
classe pública ImageType {public static void main (string [] args) {string filename = "Oschina.png"; String type = getMimetype (nome do arquivo); System.out.println (tipo); filename = "Oschina"; type = getMimetype (nome do arquivo); System.out.println (tipo); }} Saída
imagem/jpeg
imagem/jpeg
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.