java判断文件的真实类型

在文件传输过程中,为了安全验证,对于手工改动文件后缀名产生的伪造文件进行判断过滤。

比如,我们需要的是excel文件,如果不加验证内容,将一些可执行的文件通过更改后缀传输给你,就是一个很大的漏洞了。

java判断文件真实类型依靠的是文件的头部编码信息,具体代码如下:

[java] view plain copy
  1. <span style="font-size:12px;">package com.zhuifeng.util.excel;  
  2.   
  3. import java.io.FileInputStream;  
  4. import java.io.IOException;  
  5. import java.util.HashMap;  
  6.   
  7. /** 
  8.  * @author guoxk 
  9.  *  
  10.  * @version 创建时间 2016年7月17日 上午10:47:26 
  11.  *  
  12.  * 类描述:获取和判断文件头信息  
  13.  *    |--文件头是位于文件开头的一段承担一定任务的数据,一般都在开头的部分。 
  14.  *    |--头文件作为一种包含功能函数、数据接口声明的载体文件,用于保存程序的声明(declaration),而定义文件用于保存程序的实现(implementation)。 
  15.  *    |--为了解决在用户上传文件的时候在服务器端判断文件类型的问题,故用获取文件头的方式,直接读取文件的前几个字节,来判断上传文件是否符合格式。 
  16.  *  
  17.  */  
  18. public class CheckExcelFileTypeUtil {  
  19.     // 缓存文件头信息-文件头信息  
  20.     public static final HashMap<String, String> mFileTypes = new HashMap<String, String>();  
  21.     static {  
  22.         // images  
  23.         mFileTypes.put("FFD8FF""jpg");  
  24.         mFileTypes.put("89504E47""png");  
  25.         mFileTypes.put("47494638""gif");  
  26.         mFileTypes.put("49492A00""tif");  
  27.         mFileTypes.put("424D""bmp");  
  28.         //  
  29.         mFileTypes.put("41433130""dwg"); // CAD  
  30.         mFileTypes.put("38425053""psd");  
  31.         mFileTypes.put("7B5C727466""rtf"); // 日记本  
  32.         mFileTypes.put("3C3F786D6C""xml");  
  33.         mFileTypes.put("68746D6C3E""html");  
  34.         mFileTypes.put("44656C69766572792D646174653A""eml"); // 邮件  
  35.         mFileTypes.put("D0CF11E0""doc");  
  36.         mFileTypes.put("D0CF11E0""xls");//excel2003版本文件  
  37.         mFileTypes.put("5374616E64617264204A""mdb");  
  38.         mFileTypes.put("252150532D41646F6265""ps");  
  39.         mFileTypes.put("255044462D312E""pdf");  
  40.         mFileTypes.put("504B0304""docx");  
  41.         mFileTypes.put("504B0304""xlsx");//excel2007以上版本文件  
  42.         mFileTypes.put("52617221""rar");  
  43.         mFileTypes.put("57415645""wav");  
  44.         mFileTypes.put("41564920""avi");  
  45.         mFileTypes.put("2E524D46""rm");  
  46.         mFileTypes.put("000001BA""mpg");  
  47.         mFileTypes.put("000001B3""mpg");  
  48.         mFileTypes.put("6D6F6F76""mov");  
  49.         mFileTypes.put("3026B2758E66CF11""asf");  
  50.         mFileTypes.put("4D546864""mid");  
  51.         mFileTypes.put("1F8B08""gz");  
  52.     }  
  53.   
  54.     /** 
  55.      * @author guoxk 
  56.      * 
  57.      * 方法描述:根据文件路径获取文件头信息 
  58.      * @param filePath 文件路径 
  59.      * @return 文件头信息 
  60.      */  
  61.     public static String getFileType(String filePath) {  
  62. //      System.out.println(getFileHeader(filePath));  
  63. //      System.out.println(mFileTypes.get(getFileHeader(filePath)));  
  64.         return mFileTypes.get(getFileHeader(filePath));  
  65.     }  
  66.   
  67.     /** 
  68.      * @author guoxk 
  69.      * 
  70.      * 方法描述:根据文件路径获取文件头信息 
  71.      * @param filePath 文件路径 
  72.      * @return 文件头信息 
  73.      */  
  74.     public static String getFileHeader(String filePath) {  
  75.         FileInputStream is = null;  
  76.         String value = null;  
  77.         try {  
  78.             is = new FileInputStream(filePath);  
  79.             byte[] b = new byte[4];  
  80.             /* 
  81.              * int read() 从此输入流中读取一个数据字节。int read(byte[] b) 从此输入流中将最多 b.length 
  82.              * 个字节的数据读入一个 byte 数组中。 int read(byte[] b, int off, int len) 
  83.              * 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。 
  84.              */  
  85.             is.read(b, 0, b.length);  
  86.             value = bytesToHexString(b);  
  87.         } catch (Exception e) {  
  88.         } finally {  
  89.             if (null != is) {  
  90.                 try {  
  91.                     is.close();  
  92.                 } catch (IOException e) {  
  93.                 }  
  94.             }  
  95.         }  
  96.         return value;  
  97.     }  
  98.   
  99.     /** 
  100.      * @author guoxk 
  101.      * 
  102.      * 方法描述:将要读取文件头信息的文件的byte数组转换成string类型表示 
  103.      * @param src 要读取文件头信息的文件的byte数组 
  104.      * @return   文件头信息 
  105.      */  
  106.     private static String bytesToHexString(byte[] src) {  
  107.         StringBuilder builder = new StringBuilder();  
  108.         if (src == null || src.length <= 0) {  
  109.             return null;  
  110.         }  
  111.         String hv;  
  112.         for (int i = 0; i < src.length; i++) {  
  113.             // 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式,并转换为大写  
  114.             hv = Integer.toHexString(src[i] & 0xFF).toUpperCase();  
  115.             if (hv.length() < 2) {  
  116.                 builder.append(0);  
  117.             }  
  118.             builder.append(hv);  
  119.         }  
  120. //      System.out.println(builder.toString());  
  121.         return builder.toString();  
  122.     }  
  123.     /** 
  124.      * @author guoxk 
  125.      * 
  126.      * 方法描述:测试 
  127.      * @param args 
  128.      * @throws Exception 
  129.      */  
  130.     public static void main(String[] args) throws Exception {  
  131.         final String fileType = getFileType("E:\\补贴名单.xls");  
  132.         System.out.println(fileType);  
  133.     }</span><span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="java"><span style="font-size:12px;">}</span> 
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值