uploadify上传及后台文件合法性验证的代码解析
后台上传方法
@RequestMapping(value="/api_upload",method=RequestMethod.POST)
public@ResponseBodyStringupload(HttpServletRequestrequest,HttpServletResponseresponse){
//获取上传路径
StringuploadFilePath=ParameterConstants.UPLOAD_FILE_PATH;
StringstorePath="";
MultipartHttpServletRequestmultipartRequest=(MultipartHttpServletRequest)request;
//获取前台传值
String[]folders=multipartRequest.getParameterValues("path");
Stringfolder="";
if(folders!=null){
folder=folders[0];
storePath+=folder+"/";
}
Map<String,MultipartFile>fileMap=multipartRequest.getFileMap();
SimpleDateFormatsdf=newSimpleDateFormat("yyyyMM");
Stringymd=sdf.format(newDate());
storePath+=ymd+"/";
//创建文件夹
Filefile=newFile(uploadFilePath+storePath);
if(!file.exists()){
file.mkdirs();
}
StringfileName=null;
Stringpath=null;
for(Map.Entry<String,MultipartFile>entity:fileMap.entrySet()){
//上传文件名
MultipartFilemf=entity.getValue();
fileName=mf.getOriginalFilename();
Stringuuid=UUID.randomUUID().toString().replaceAll("\\-","");//返回一个随机UUID。
Stringsuffix=fileName.indexOf(".")!=-1?fileName.substring(
fileName.lastIndexOf("."),fileName.length()):null;
StringnewFileName=uuid+(suffix!=null?suffix:"");//构成新文件名。
FileuploadFile=newFile(uploadFilePath+storePath+newFileName);
try{
/**
*验证上传文件的合法性
*/
CommonsMultipartFilecmf=(CommonsMultipartFile)mf;
booleanisValid=CheckoutFileType.getUpFilelegitimacyFlag(cmf.getFileItem(),".jpg.gif.png.jpeg");
if(!isValid){
System.out.println("上传图片不合法");
returnnull;
}
FileCopyUtils.copy(mf.getBytes(),uploadFile);
storePath=storePath+newFileName;
}catch(IOExceptione){
e.printStackTrace();
}
}
returnstorePath;
}
文件合法性验证类
packagecom.kaiyuan.common.util;
importjava.io.FileInputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.util.HashMap;
importjava.util.Map;
importorg.apache.commons.fileupload.FileItem;
/**
*@Description:处理上传附件,校验是否合法在服务器端判断文件类型的问题,故用获取文件头的方式,
*直接读取文件的前几个字节,来判断上传文件是否符合格式
*/
publicclassCheckoutFileType{
//记录各个文件头信息及对应的文件类型
publicstaticMap<String,String>mFileTypes=newHashMap<String,String>();
//所有合法的文件后缀
publicstaticStringres_fileType=".jpg.gif.png.jpeg";
static{
//images
mFileTypes.put("FFD8FFE0",".jpg");
mFileTypes.put("89504E47",".png");
mFileTypes.put("47494638",".gif");
mFileTypes.put("49492A00",".tif");
mFileTypes.put("424D",".bmp");
//PS和CAD
mFileTypes.put("38425053",".psd");
mFileTypes.put("41433130",".dwg");//CAD
mFileTypes.put("252150532D41646F6265",".ps");
//办公文档类
mFileTypes.put("D0CF11E0",".doc");//ppt、doc、xls
mFileTypes.put("504B0304",".docx");//pptx、docx、xlsx
/**注意由于文本文档录入内容过多,则读取文件头时较为多变-START**/
mFileTypes.put("0D0A0D0A",".txt");//txt
mFileTypes.put("0D0A2D2D",".txt");//txt
mFileTypes.put("0D0AB4B4",".txt");//txt
mFileTypes.put("B4B4BDA8",".txt");//文件头部为汉字
mFileTypes.put("73646673",".txt");//txt,文件头部为英文字母
mFileTypes.put("32323232",".txt");//txt,文件头部内容为数字
mFileTypes.put("0D0A09B4",".txt");//txt,文件头部内容为数字
mFileTypes.put("3132330D",".txt");//txt,文件头部内容为数字
/**注意由于文本文档录入内容过多,则读取文件头时较为多变-END**/
mFileTypes.put("7B5C727466",".rtf");//日记本
mFileTypes.put("255044462D312E",".pdf");
//视频或音频类
mFileTypes.put("3026B275",".wma");
mFileTypes.put("57415645",".wav");
mFileTypes.put("41564920",".avi");
mFileTypes.put("4D546864",".mid");
mFileTypes.put("2E524D46",".rm");
mFileTypes.put("000001BA",".mpg");
mFileTypes.put("000001B3",".mpg");
mFileTypes.put("6D6F6F76",".mov");
mFileTypes.put("3026B2758E66CF11",".asf");
//压缩包
mFileTypes.put("52617221",".rar");
mFileTypes.put("1F8B08",".gz");
//程序文件
mFileTypes.put("3C3F786D6C",".xml");
mFileTypes.put("68746D6C3E",".html");
mFileTypes.put("7061636B",".java");
mFileTypes.put("3C254020",".jsp");
mFileTypes.put("4D5A9000",".exe");
mFileTypes.put("44656C69766572792D646174653A",".eml");//邮件
mFileTypes.put("5374616E64617264204A",".mdb");//Access数据库文件
mFileTypes.put("46726F6D",".mht");
mFileTypes.put("4D494D45",".mhtml");
}
/**
*根据文件的输入流获取文件头信息
*
*@paramfilePath
*文件路径
*@return文件头信息
*/
publicstaticStringgetFileType(InputStreamis){
byte[]b=newbyte[4];
if(is!=null){
try{
is.read(b,0,b.length);
}catch(IOExceptione){
e.printStackTrace();
}
}
returnmFileTypes.get(getFileHeader(b));
}
/**
*根据文件转换成的字节数组获取文件头信息
*
*@paramfilePath
*文件路径
*@return文件头信息
*/
publicstaticStringgetFileHeader(byte[]b){
Stringvalue=bytesToHexString(b);
returnvalue;
}
/**
*将要读取文件头信息的文件的byte数组转换成string类型表示下面这段代码就是用来对文件类型作验证的方法,
*将字节数组的前四位转换成16进制字符串,并且转换的时候,要先和0xFF做一次与运算。
*这是因为,整个文件流的字节数组中,有很多是负数,进行了与运算后,可以将前面的符号位都去掉,
*这样转换成的16进制字符串最多保留两位,如果是正数又小于10,那么转换后只有一位,
*需要在前面补0,这样做的目的是方便比较,取完前四位这个循环就可以终止了
*
*@paramsrc要读取文件头信息的文件的byte数组
*@return文件头信息
*/
privatestaticStringbytesToHexString(byte[]src){
StringBuilderbuilder=newStringBuilder();
if(src==null||src.length<=0){
returnnull;
}
Stringhv;
for(inti=0;i<src.length;i++){
//以十六进制(基数16)无符号整数形式返回一个整数参数的字符串表示形式,并转换为大写
hv=Integer.toHexString(src[i]&0xFF).toUpperCase();
if(hv.length()<2){
builder.append(0);
}
builder.append(hv);
}
System.out.println("获取文件头信息:"+builder.toString());
returnbuilder.toString();
}
/**
*判断上传的文件是否合法(一)、第一:检查文件的扩展名,(二)、第二:检查文件的MIME类型。
*
*@paramattachDoc
*@returnboolean
*/
publicstaticbooleangetUpFilelegitimacyFlag(FileItemattachDoc,StringallowType){
booleanupFlag=false;//为真表示符合上传条件,为假表标不符合
if(attachDoc!=null){
StringattachName=attachDoc.getName();
System.out.println("#######上传的文件:"+attachName);
if(!"".equals(attachName)&&attachName!=null){
/**返回在此字符串中最右边出现的指定子字符串的索引**/
Stringsname=attachName
.substring(attachName.lastIndexOf("."));
/**统一转换为小写**/
sname=sname.toLowerCase();
/**第一步:检查文件扩展名,是否符合要求范围**/
if(allowType.indexOf(sname)!=-1){
upFlag=true;
}
/**
*第二步:获取上传附件的文件头,判断属于哪种类型,并获取其扩展名直接读取文件的前几个字节,来判断上传文件是否符合格式
*防止上传附件变更扩展名绕过校验
***/
if(upFlag){
byte[]b=newbyte[4];
Stringreq_fileType=null;
try{
req_fileType=getFileType(attachDoc.getInputStream());
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
System.out.println("///////用户上传的文件类型///////////"
+req_fileType);
/**第三步:检查文件扩展名,是否符合要求范围**/
if(req_fileType!=null&&!"".equals(req_fileType)
&&!"null".equals(req_fileType)){
/**第四步:校验上传的文件扩展名,是否在其规定范围内**/
if(allowType.indexOf(req_fileType)!=-1){
upFlag=true;
}else{
upFlag=false;
}
}else{
/**特殊情况校验,如果用户上传的扩展名为,文本文件,则允许上传-START**/
if(sname.indexOf(".txt")!=-1){
upFlag=true;
}else{
upFlag=false;
}
/**特殊情况校验,如果用户上传的扩展名为,文本文件,则允许上传-END**/
}
}
}
}
returnupFlag;
}
/**
*主函数,测试用
*
*@paramargs
*@throwsException
*/
publicstaticvoidmain(String[]args)throwsException{
//finalStringfileType=getFileType("D:/BICP-HUAWEI.mht");
FileInputStreamis=null;
Stringvalue=null;
StringfilePath="e:/aa/c.txt";
try{
is=newFileInputStream(filePath);
byte[]b=newbyte[4];
is.read(b,0,b.length);
value=bytesToHexString(b);
}catch(Exceptione){
}finally{
if(null!=is){
try{
is.close();
}catch(IOExceptione){
}
}
}
System.out.println(value);
}
}
前端上传js
$(document).ready(function(){
newTextMagnifier({
inputElem:'#bankCardNo',
align:'top',
splitType:[4,4,4,5,5],
delimiter:''
});
$('#file_upload').uploadify({
'formData':{
'path':'/uploadfilePath',
},
'swf':'${pageContext.request.contextPath}/js/upload/uploadify.swf',
'uploader':getBasePath()+'/upload/api_upload;jsessionid=${pageContext.session.id}',
'cancelImg':'${pageContext.request.contextPath}/js/upload/uploadify-cancel.png',
'buttonText':'上传',
'auto':true,
'multi':true,
'uploadLimit':100,
'removeCompleted':true,
'fileTypeExts':'*.jpg;*.gif;*.png;*.jpeg;',
'fileSizeLimit':'2MB',
'fileTypeDesc':'上传',
'onUploadSuccess':function(file,data,response){
if(data!=null&&data.length>0){
varuploadFiles=$("#tickets").val().split(',');
varuploadFileSize=uploadFiles.length;
if(uploadFileSize>5){
layer.msg("最多上传5张图片");
return;
}
addTickets(data);
/*layer.ready(function(){
layer.photos({
photos:'#imgShow',
shade:0.5
});
});*/
}else{
layer.msg("上传失败");
}
isUploadSuccess=true;
},
'onUploadError':function(file,errorCode,errorMsg,errorString){
if(errorString.indexOf('Theuploadlimithasbeenreached')){
layer.msg(errorString);
}
},
'onSelect':function(file){
//alert('Thefile'+file.name+'wasaddedtothequeue.');
isUploadSuccess=false;
},
'onSelectError':function(file,errorCode,errorMsg){
switch(errorCode){
case-110:
layer.msg("文件大小超过了2M");
break;
case-100:
layer.msg("最多上传5张图片");
break;
default:
layer.msg(errorMsg);
}
},
'onDialogClose':function(queueData){
varuploadFiles=$("#tickets").val().split(',');
varuploadFileSize=uploadFiles.length;
if(uploadFileSize>5){
layer.msg("最多上传5张图片");
queueData.filesSelected=0
returnfalse;
}
}
});
onQuery();
});
以上所述是小编给大家介绍的uploadify上传及后台文件合法性验证的代码解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!