上传文件时经常需要做文件类型判断,例如图片、文档等,普通做法是直接判断文件后缀名,而文艺青年为了防止各种攻击同时也会加上使用文件头信息判断文件类型。
原理很简单:用文件头判断,直接读取文件的前2个字节即可。
1 public class FileUtil { 2 /** 3 * byte数组转换成16进制字符串 4 * 5 * @param src 6 * @return 7 */ 8 private static String bytesToHexString(byte[] src) { 9 StringBuilder stringBuilder = new StringBuilder(); 10 if (src == null || src.length <= 0) { 11 return null; 12 } 13 for (int i = 0; i < src.length; i++) { 14 // 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式,并转换为大写 15 String hv = Integer.toHexString(src[i] & 0xFF).toUpperCase(); 16 if (hv.length() < 2) { 17 stringBuilder.append(0); 18 } 19 stringBuilder.append(hv); 20 } 21 return stringBuilder.toString(); 22 } 23 24 /** 25 * 根据文件路径获取文件头信息 26 * 27 * @param filePath 28 * 文件路径 29 * @return 文件头信息 30 */ 31 public static String getFileType(String filePath) { 32 String bytes = getFileHeader(filePath); 33 if (bytes != null) { 34 if (bytes.contains("FFD8FF")) { 35 return "jpg"; 36 } else if (bytes.contains("89504E47")) { 37 return "png"; 38 } else if (bytes.contains("47494638")) { 39 return "gif"; 40 } else if (bytes.contains("49492A00")) { 41 return "tif"; 42 } else if (bytes.contains("424D")) { 43 return "bmp"; 44 } 45 } 46 return null; 47 } 48 49 50 /** 51 * 根据文件路径获取文件头信息 52 * 53 * @param filePath 54 * 文件路径 55 * @return 文件头信息 56 */ 57 public static String getFileHeader(String filePath) { 58 FileInputStream is = null; 59 String value = null; 60 try { 61 is = new FileInputStream(filePath); 62 byte[] b = new byte[4]; 63 is.read(b, 0, b.length); 64 value = bytesToHexString(b); 65 } catch (Exception e) { 66 } finally { 67 if (null != is) { 68 try { 69 is.close(); 70 } catch (IOException e) { 71 } 72 } 73 } 74 return value; 75 } 76 77 public static void main(String[] args) throws Exception { 78 System.out.println(getFileType("F:\\old file\\论坛头像数据采集\\未命名.bmp")); 79 } 80 }
这里增加客户端jsp调用实例
1 String ext = FileUtil.getFileType(srcFilePath); 2 if(app.getFileExts()!=null && !app.getFileExts().contains(ext)){ 3 File invalidFile = new File(srcFilePath); 4 if(invalidFile.isFile()) invalidFile.delete(); 5 System.out.println("Unsupport file type: "+ext+" in tx:"+tx.getTransactionId()); 6 throw new Exception("Unsupport file type: "+ext+" in tx:"+tx.getTransactionId()); 7 }
顺便贴上各种常见文件头
1 JPEG (jpg),文件头:FFD8FF 2 PNG (png),文件头:89504E47 3 GIF (gif),文件头:47494638 4 TIFF (tif),文件头:49492A00 5 Windows Bitmap (bmp),文件头:424D 6 CAD (dwg),文件头:41433130 7 Adobe Photoshop (psd),文件头:38425053 8 Rich Text Format (rtf),文件头:7B5C727466 9 XML (xml),文件头:3C3F786D6C 10 HTML (html),文件头:68746D6C3E 11 Email [thorough only] (eml),文件头:44656C69766572792D646174653A 12 Outlook Express (dbx),文件头:CFAD12FEC5FD746F 13 Outlook (pst),文件头:2142444E 14 MS Word/Excel (xls.or.doc),文件头:D0CF11E0 15 MS Access (mdb),文件头:5374616E64617264204A 16 WordPerfect (wpd),文件头:FF575043 17 Postscript (eps.or.ps),文件头:252150532D41646F6265 18 Adobe Acrobat (pdf),文件头:255044462D312E 19 Quicken (qdf),文件头:AC9EBD8F 20 Windows Password (pwl),文件头:E3828596 21 ZIP Archive (zip),文件头:504B0304 22 RAR Archive (rar),文件头:52617221 23 Wave (wav),文件头:57415645 24 AVI (avi),文件头:41564920 25 Real Audio (ram),文件头:2E7261FD 26 Real Media (rm),文件头:2E524D46 27 MPEG (mpg),文件头:000001BA 28 MPEG (mpg),文件头:000001B3 29 Quicktime (mov),文件头:6D6F6F76 30 Windows Media (asf),文件头:3026B2758E66CF11 31 MIDI (mid),文件头:4D546864
内容来自:cnblogs:牛奶、不加糖
时间: 2024-10-21 03:58:38