1. 程式人生 > >利用文件頭判斷文件類型

利用文件頭判斷文件類型

tostring 整數 inpu str eal ext format urn XML

上傳文件時經常需要做文件類型判斷,例如圖片、文檔等,普通做法是直接判斷文件後綴名,而文藝青年為了防止各種攻擊同時也會加上使用文件頭信息判斷文件類型。

原理很簡單:用文件頭判斷,直接讀取文件的前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:牛奶、不加糖

利用文件頭判斷文件類型