在文件传输过程中,为了安全验证,对于手工改动文件后缀名产生的伪造文件进行判断过滤。
比如,我们需要的是excel文件,如果不加验证内容,将一些可执行的文件通过更改后缀传输给你,就是一个很大的漏洞了。
Java判断文件真实类型依靠的是文件的头部编码信息,具体代码如下:
packagecom.zhuifeng.util.excel; importjava.io.FileInputStream; importjava.io.IOException; importjava.util.HashMap; /** * @author guoxk * * 类描述:获取和判断文件头信息 * |--文件头是位于文件开头的一段承担一定任务的数据,一般都在开头的部分。 * |--头文件作为一种包含功能函数、数据接口声明的载体文件,用于保存程序的声明(declaration),而定义文件用于保存程序的实现(implementation)。 * |--为了解决在用户上传文件的时候在服务器端判断文件类型的问题,故用获取文件头的方式,直接读取文件的前几个字节,来判断上传文件是否符合格式。 * */ publicclassCheckExcelFileTypeUtil { // 缓存文件头信息-文件头信息 publicstaticfinalHashMapmFileTypes =newHashMap (); static{ // images mFileTypes.put("FFD8FF","jpg"); mFileTypes.put("89504E47","png"); mFileTypes.put("47494638","gif"); mFileTypes.put("49492A00","tif"); mFileTypes.put("424D","bmp"); // mFileTypes.put("41433130","dwg");// CAD mFileTypes.put("38425053","psd"); mFileTypes.put("7B5C727466","rtf");// 日记本 mFileTypes.put("3C3F786D6C","xml"); mFileTypes.put("68746D6C3E","html"); mFileTypes.put("44656C69766572792D646174653A","eml");// 邮件 mFileTypes.put("D0CF11E0","doc"); mFileTypes.put("D0CF11E0","xls");//excel2003版本文件 mFileTypes.put("5374616E64617264204A","mdb"); mFileTypes.put("252150532D41646F6265","ps"); mFileTypes.put("255044462D312E","pdf"); mFileTypes.put("504B0304","docx"); mFileTypes.put("504B0304","xlsx");//excel2007以上版本文件 mFileTypes.put("52617221","rar"); mFileTypes.put("57415645","wav"); mFileTypes.put("41564920","avi"); mFileTypes.put("2E524D46","rm"); mFileTypes.put("000001BA","mpg"); mFileTypes.put("000001B3","mpg"); mFileTypes.put("6D6F6F76","mov"); mFileTypes.put("3026B2758E66CF11","asf"); mFileTypes.put("4D546864","mid"); mFileTypes.put("1F8B08","gz"); } /** * @author guoxk * * 方法描述:根据文件路径获取文件头信息 * @param filePath 文件路径 * @return 文件头信息 */ publicstaticString getFileType(String filePath) { // System.out.println(getFileHeader(filePath)); // System.out.println(mFileTypes.get(getFileHeader(filePath))); returnmFileTypes.get(getFileHeader(filePath)); } /** * @author guoxk * * 方法描述:根据文件路径获取文件头信息 * @param filePath 文件路径 * @return 文件头信息 */ publicstaticString getFileHeader(String filePath) { FileInputStream is =null; String value =null; try{ is =newFileInputStream(filePath); byte[] b =newbyte[4]; /* * int read() 从此输入流中读取一个数据字节。int read(byte[] b) 从此输入流中将最多 b.length * 个字节的数据读入一个 byte 数组中。 int read(byte[] b, int off, int len) * 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。 */ is.read(b, 0, b.length); value = bytesToHexString(b); } catch (Exception e) { } finally { if (null != is) { try { is.close(); } catch (IOException e) { } } } return value; } /** * @author guoxk * * 方法描述:将要读取文件头信息的文件的byte数组转换成string类型表示 * @param src 要读取文件头信息的文件的byte数组 * @return 文件头信息 */ private static String bytesToHexString(byte[] src) { StringBuilder builder = new StringBuilder(); if (src == null || src.length
恋爱进行时九游版
恋爱进行时九游版是一款以模拟恋爱玩法为核心的角色扮演手游,精
皇室对决fr(Null’s Royale)
皇室对决fr,即皇室战争的私服变态版本,在该版本中玩家能够拥
养了个猫联机版游戏
养了个猫小游戏一个猫咪主题的模拟经营类型的手游,在游戏中我那
模拟山羊收获日小米版
模拟山羊收获日小米版是一个极其魔性的手机游戏,在游戏中玩家将
女配逆袭之素衣
女配逆袭之素衣是一款恋爱养成冒险的一款游戏,可以角色扮演,在