后台上传方法
@Requestmapping (value = "/api_upload", method = requestMethod.post) public @Responsebody string upload (httpservletrequest, httpservletresponse response) {// 获取上传路径 string uploadfilepath = parameterconstants.upload_file_path; String storePath = ""; MultiparthttpservletRequest multipartRtequest = (MultiparthttpservletRequest) запрос; // 获取前台传值 string [] folders = multipartRequest.getParametRovalues ("path"); String folder = ""; if (папки! = null) {folder = folders [0]; StorePath+= folder+"/"; } Map <string, multiplaRtfile> fileMap = multipRtequevest.getFileMap (); SimpleDateFormat SDF = new SimpleDateFormat ("yyyyMm"); String ymd = sdf.format (new date ()); StorePath + = ymd + "/"; // 创建文件夹 file file = new File (uploadFilePath+StorePath); if (! file.exists ()) {file.mkdirs (); } String filename = null; String Path = null; for (map.Entry <string, multiplaRtfile> entity: fileMap.EntrySet ()) {// 上传文件名 MultipArtFile mf = entity.getValue (); filename = mf.getoriginalfilename (); String uuid = uuid.randomuuid (). ToString (). RyplaceAll ("// -", ""); // 返回一个随机 Uuid。 String Suffix = filename.indexof (".")! = -1? filename.substring (filename.lastindexof ("."), filename.length ()): null; String newFilename = uuid + (суффикс! = Null? Суффикс: ""); // 构成新文件名。 file uploadfile = новый файл (uploadfilepath + storepath + newfilename); try { / ** * 验证上传文件的合法性 * / commonsmultipartfile cmf = (commonsmultipartfile) mf; boolean isvalid = checkoutFileType.getupFilelegitImacyflag (cmf.getFileItem (), ". jpg.gif.png.jpeg"); if (! isvalid) {System.out.println ("上传图片不合法"); вернуть ноль; } Filecopyutils.copy (mf.getbytes (), uploadfile); StorePath = StorePath + NewFilename; } catch (ioException e) {e.printstackTrace (); }} return StorePath; }文件合法性验证类
пакет com.kaiyuan.common.util; импортировать java.io.fileinputstream; импортировать java.io.ioexception; импортировать java.io.inputstream; импортировать java.util.hashmap; импортировать java.util.map; Импорт org.apache.commons.fileupload.fileitem; / ** * @description: 处理上传附件, 校验是否合法 在服务器端判断文件类型的问题 , 故用获取文件头的方式 , * 直接读取文件的前几个字节 , 来判断上传文件是否符合格式 */ public class keeckoutfiletype {// 记录各个文件头信息及对应的文件类型 public static map <string, string> mfiletypes = new hashmap <string, string> (); // 所有合法的文件后缀 public static String res_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 ("0d0ad0a", ".txt"); mfiletypes.put ("0d0a2d2d", ".txt"); // txt mfiletypes.put ("0d0ab4b4", ".txt"); // txt mfiletypes.put ("b4b4bda8", ".txt"); // mfileTypes.put.put "," .txt "); ".txt"); // txt, 文件头部为英文字母 mfiletypes.put ("32323232", ".txt"); // txt, 文件头部内容为数字 mfiletypes.put ("0d0a09b4", ".txt"); // txt, 文件头部内容为数字 mfileTypes.put ("3132330d".注意由于文本文档录入内容过多 , 则读取文件头时较为多变 -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"); // Доступ 数据库文件 mfileTypes.put ("46726f6d", ".mht"); mfiletypes.put ("4d494d45", ".mhtml"); } / ** * 根据文件的输入流获取文件头信息 * * @param filepath * 文件路径 * @return 文件头信息 * / public static String getFileType (inputStream IS) {byte [] b = new Byte [4]; if (is! = null) {try {is.read (b, 0, b.length); } catch (ioException e) {e.printstackTrace (); }} return mfileTypes.get (getFileHeader (b)); } / ** * 根据文件转换成的字节数组获取文件头信息 * * @param filepath * 文件路径 * @return 文件头信息 * / public static String getFileHeader (byte [] b) {string value = byteStoHexString (b); возвращаемое значение; } / ** * 将要读取文件头信息的文件的 Byte 数组转换成 String 类型表示 下面这段代码就是用来对文件类型作验证的方法 , * 将字节数组的前四位转换成 16 进制字符串 , 并且转换的时候 , 要先和 0xff 做一次与运算。 * 这是因为 , 整个文件流的字节数组中 有很多是负数 有很多是负数 进行了与运算后 , 可以将前面的符号位都去掉 , * 这样转换成的 16 进制字符串最多保留两位 , 如果是正数又小于 10 , 那么转换后只有一位 * 需要在前面补 0 , 这样做的目的是方便比较 取完前四位这个循环就可以终止了 * @param Src 要读取文件头信息的文件的 要读取文件头信息的文件的 数组 @ @ @ @ @ @ @ @ @ @取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 这样做的目的是方便比较 这样做的目的是方便比较 这样做的目的是方便比较 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 取完前四位这个循环就可以终止了 , 可以将前面的符号位都去掉 , 取完前四位这个循环就可以终止了 , , 可以将前面的符号位都去掉 , n bytestohexstring (byte [] src) {stringbuilder builder = new StringBuilder (); if (src == null || src.length <= 0) {return null; } String HV; for (int i = 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 ()); return Builder.toString (); }/ ** * 判断上传的文件是否合法 (一 、第一 : 检查文件的扩展名 , (二) 、 : : 检查文件的 Mime 类型。 * * @param attledoc * @return boolean */ public static boolean getupfilelegitimacyflag (fileitem attledoc, string alluctpe) {boolean upflag = false; {String attrogname = attrydoc.getname (); sname.tolower (); Try {req_filetype = getFileType (AttachDoc.getInputStream ());第三步 : 检查文件扩展名 , **/ if (req_filetype! = Null &&! "". Equals (req_filetype) &&! "Null" .equals (req_filetype)) {/ ** 第四步 : 校验上传的文件扩展名 校验上传的文件扩展名 是否在其规定范围内 **/ if (alluctype.indexof (req_filetyp)! } else {upflag = false; }} else { / ** 特殊情况校验, 如果用户上传的扩展名为, 文本文件, 则允许上传 -Start ** / if (sname.indexof (". txt")! = -1) {upflag = true; } else {upflag = false; } / ** 特殊情况校验, 如果用户上传的扩展名为, 文本文件, 则允许上传 -end ** /}}}} return upflag; }/** * 主函数 , 测试用 * * @param args * @throhs Exception */public static void main (string [] args) Throws Exception {// final String fileType = getFileType ("d: /bicp-huawei.mht"); FileInputStream IS = null; String value = null; String filePath = "e: /aa/c.txt"; try {is = new FileInputStream (filePath); байт [] b = новый байт [4]; is.read (b, 0, b.length); value = byteStohexString (b); } catch (Exception e) {} наконец {if (null! = is) {try {is.close (); } catch (ioException e) {}}} system.out.println (value); }}前端上传 JS
$ (document) .ready (function () {new TextMagnifier ({inputeLem: '#BankCardno', align: 'top', splitType: [4,4,4,5,5], делимина: ''}); $ ('#file_upload'). : '$ {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, 'multiPeexts': «uploadlimit»: 100, 'RemoveCepted': true, 'fileTypeExts': upload ': 100,' RemoveCepted ': true,' fileTypeexts ': '*.jpg;*. Gif;*. Png;*. Jpeg;', 'filesizeLimit': '2mb', 'fileTypedESC': '上传', 'onUploadSuccess': function (file, data) {if (data! uploadfiles = uploadfiles.length; isuploadSuccess = true; }, 'onuploaderRor': function (файл, ошибка кода, ошибки, ошибка, ошибка) {if (errorString.indexof ('предел загрузки был достигнут')) {layer.msg (errorString); }}, 'onselect': function (file) {// alert ('the file' + file.name + 'был добавлен в очередь.'); isuploadSuccess = false; }, 'onselecterror': function (file, errorcode, errorrormsg) {switch (errorcode) {case -110: layer.msg ("文件大小超过了 2m"); перерыв; case -100: layer.msg ("最多上传 5 张图片"); перерыв; по умолчанию: layer.msg (errormsg); }}, 'ondialogclose': function (queuedata) {var uploadfiles = $ ("#билеты"). val (). split (','); var oploadFilesize = uploadfiles.length; if (uploadfilesize> 5) {layer.msg ("最多上传 5 张图片"); queuedata.filesselected = 0 вернуть false; }}}); onquery (); });以上所述是小编给大家介绍的 Загрузить 上传及后台文件合法性验证的代码解析 希望对大家有所帮助 , 如果大家有任何疑问请给我留言 , 小编会及时回复大家的。在此也非常感谢大家对武林网网站的支持!