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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。