java如何实现判断文件的真实类型
在文件传输过程中,为了安全验证,对于手工改动文件后缀名产生的伪造文件进行判断过滤。
比如,我们需要的是excel文件,如果不加验证内容,将一些可执行的文件通过更改后缀传输给你,就是一个很大的漏洞了。
Java判断文件真实类型依靠的是文件的头部编码信息,具体代码如下:
packagecom.zhuifeng.util.excel; importjava.io.FileInputStream; importjava.io.IOException; importjava.util.HashMap; /** *@authorguoxk * *类描述:获取和判断文件头信息 *|--文件头是位于文件开头的一段承担一定任务的数据,一般都在开头的部分。 *|--头文件作为一种包含功能函数、数据接口声明的载体文件,用于保存程序的声明(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"); } /** *@authorguoxk * *方法描述:根据文件路径获取文件头信息 *@paramfilePath文件路径 *@return文件头信息 */ publicstaticStringgetFileType(StringfilePath){ //System.out.println(getFileHeader(filePath)); //System.out.println(mFileTypes.get(getFileHeader(filePath))); returnmFileTypes.get(getFileHeader(filePath)); } /** *@authorguoxk * *方法描述:根据文件路径获取文件头信息 *@paramfilePath文件路径 *@return文件头信息 */ publicstaticStringgetFileHeader(StringfilePath){ FileInputStreamis=null; Stringvalue=null; try{ is=newFileInputStream(filePath); byte[]b=newbyte[4]; /* *intread()从此输入流中读取一个数据字节。intread(byte[]b)从此输入流中将最多b.length *个字节的数据读入一个byte数组中。intread(byte[]b,intoff,intlen) *从此输入流中将最多len个字节的数据读入一个byte数组中。 */ is.read(b,0,b.length); value=bytesToHexString(b); }catch(Exceptione){ }finally{ if(null!=is){ try{ is.close(); }catch(IOExceptione){ } } } returnvalue; } /** *@authorguoxk * *方法描述:将要读取文件头信息的文件的byte数组转换成string类型表示 *@paramsrc要读取文件头信息的文件的byte数组 *@return文件头信息 */ privatestaticStringbytesToHexString(byte[]src){ StringBuilderbuilder=newStringBuilder(); if(src==null||src.length<=0){ returnnull; } Stringhv; for(inti=0;i 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。