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上传及后台文件合法性验证的代码解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!