java上传文件功能,通过ajaxSubmit获取返回值
主要实现的需求是用户上传zip文件,后台解压zip文件,对压缩包中的文件夹和文件进行校验,校验成功后会把文件存在fastdfs,校验失败会把错误信息返回到页面上,并且删除该次请求
在应用服务器创建的文件夹及文件。
前端代码:
1 <div id="tableToolbar" class="toolbar"> 2 <div class="toolbar-left"> 3 <a id="domainManage" href="javascript:void(0)" 4 class="btn btn-primary form-tool-btn btn-sm" role="button" title="上传文件"><i class="fa fa-plus"></i> 5 上传文件</a> 6 <form id="domainFileForm" enctype="multipart/form-data" method="post"> 7 <input id="uploadDomain" name="uploadDomain" type="file" style="display:none;" onchange="domainAfterEvent()"> 8 <br> 9 <span style="color:red;"> 10 1.需上传的压缩包格式必须为.zip;<br> 11 2.压缩包中需包含一个评估意见文件夹和一个评估记录表文件夹;<br> 12 3.评估意见文件中,只能有一个Excel文件;评估记录表文件夹中,可以有多个word文档 13 </span> 14 </form> 15 </div> 16 </div>
JS代码:
1 <script type="text/javascript" src="static/h5/jquery-form/jquery.form.js"></script> 2 <script type="text/javascript"> 3 //附件改变事件 4 function domainAfterEvent() { 5 var filePath=$("#uploadDomain").val(); 6 if(filePath.indexOf("zip")!=-1 || filePath.indexOf("ZIP")!=-1){ 7 $('#domainManage').addClass('disabled'); 8 $("#domainFileForm").ajaxSubmit({ 9 url: "cmos/document/cmosdoccomnorrevass/cmosDocComNorRevAssController/importExcelNormFileZip", 10 success: function (result) { 11 $('#uploadDomain').val(''); 12 $('#domainManage').removeClass('disabled'); 13 if (result.flag == 'success') { 14 layer.msg('上传成功!'); 15 } else { 16 layer.alert('上传失败!' + result.error, { 17 icon: 7, 18 area: ['400px', ''], 19 closeBtn: 0, 20 btn: ['关闭'], 21 title: "提示" 22 }); 23 } 24 }, 25 error:function(result){ 26 $('#uploadDomain').val(''); 27 $('#domainManage').removeClass('disabled'); 28 layer.alert('数据异常!' + result.responseText, { 29 icon: 7, 30 area: ['400px', ''], 31 closeBtn: 0, 32 btn: ['关闭'], 33 title: "提示" 34 }); 35 } 36 }); 37 }else{ 38 layer.msg('只支持zip格式的文件上传!'); 39 return false 40 } 41 } 42 $(document).ready(function () { 43 $('#domainManage').bind('click', function () { 44 $('#uploadDomain').click(); 45 }); 46 }); 47 48 </script>
后台代码:
1 /** 2 * 导入数据 3 */ 4 @RequestMapping({"/importExcelNormFileZip"}) 5 @ResponseBody 6 public Map<String, Object> importExcelNormFileZip(HttpServletRequest request, HttpServletResponse response) throws Exception { 7 Map<String, Object> map = new HashMap<>(); 8 response.setContentType("text/html;charset=UTF-8"); 9 SysUser user = SessionHelper.getLoginSysUser(request); 10 Long millis = System.currentTimeMillis(); 11 MultipartRequest multiRequest = (MultipartRequest) request; 12 //获取上传的ZIP文件 13 MultipartFile mutliFile = multiRequest.getFile("uploadDomain"); 14 //获取临时文件夹 15 String userPath = user.getId() + millis; 16 String filePath = DocumentPath.BASE_PATH + userPath; 17 StringBuffer errMsg = new StringBuffer(); 18 try { 19 //评估意见路径(excel文件路径) 20 String OPTION_FILE = filePath + "/out/评估意见/"; 21 //评估记录表路径(word文件路径) 22 String RECORD_FILE = filePath + "/out/评估记录表/"; 23 //导入的zip压缩包所在路径 24 String ZIP_FILE = filePath + "/zip/"; 25 //导入的zip压缩包所在路径 26 String OUT_PATH = filePath + "/out/"; 27 28 //存放zip压缩包的临时路径 29 String zipPath = ZIP_FILE + millis + ".zip"; 30 //读取上传的zip文件 31 InputStream in = mutliFile.getInputStream(); 32 //将zip文件创建到zip的临时路径中 33 createFile(zipPath); 34 FileOutputStream fos = new FileOutputStream(zipPath); 35 IOUtils.copy(in, fos); 36 in.close(); 37 fos.close(); 38 //至此,上传的zip文件已经放在了应用服务器中 39 /** 40 * 下面开始解压 41 */ 42 File zipFile = new File(zipPath); 43 //解压到OUT_PATH路径下 44 ZipUtils.unZip(zipFile,OUT_PATH); 45 map.put("flag", OpResult.success); 46 }else{ 47 File floder = new File(filePath); 48 NormReviewUtil normReviewUtil = new NormReviewUtil(); 49 normReviewUtil.deleteFloderAndFile(floder); 50 map.put("flag", OpResult.failure); 51 map.put("error", errMsg); 52 return map; 53 } 54 } catch (Exception e) { 55 File floder = new File(filePath); 56 NormReviewUtil normReviewUtil = new NormReviewUtil(); 57 normReviewUtil.deleteFloderAndFile(floder); 58 map.put("flag", OpResult.failure); 59 map.put("error", e.getMessage()); 60 return map; 61 } 62 return map; 63 }
业务代码被我删掉了,总的来说这个方法是接收到前端传过来的uploadDomain,然后对这个文件进行解析,由于我这边的需求是一个zip压缩包,然后是先把zip压缩包上传至tomact,进行解压操作,
对解压之后的文件进行数据校验,通过校验的再把它存进文件服务器,没通过校验的就把错误信息塞到map中,返回到页面上,然后再把此次请求在tomact中创建的文件删除掉;
下面的代码是操作zip文件的工具类
ZipUtils:
1 import org.slf4j.Logger; 2 import org.slf4j.LoggerFactory; 3 4 import java.io.*; 5 import java.nio.charset.Charset; 6 import java.util.Enumeration; 7 import java.util.List; 8 import java.util.zip.ZipEntry; 9 import java.util.zip.ZipFile; 10 import java.util.zip.ZipOutputStream; 11 12 public class ZipUtils { 13 private static final int BUFFER_SIZE = 2 * 1024; 14 private static final Logger LOGGER = LoggerFactory.getLogger(ZipUtils.class); 15 /** 16 * zip解压 17 * @param srcFile zip源文件 18 * @param destDirPath 解压后的目标文件夹 19 * @throws RuntimeException 解压失败会抛出运行时异常 20 */ 21 public static void unZip(File srcFile, String destDirPath) throws RuntimeException { 22 long start = System.currentTimeMillis(); 23 // 判断源文件是否存在 24 if (!srcFile.exists()) { 25 throw new RuntimeException(srcFile.getPath() + "所指文件不存在"); 26 } 27 // 开始解压 28 ZipFile zipFile = null; 29 try { 30 zipFile = new ZipFile(srcFile, Charset.forName("gbk")); 31 Enumeration<?> entries = zipFile.entries(); 32 while (entries.hasMoreElements()) { 33 ZipEntry entry = (ZipEntry) entries.nextElement(); 34 System.out.println("解压" + entry.getName()); 35 // 如果是文件夹,就创建个文件夹 36 if (entry.isDirectory()) { 37 String dirPath = destDirPath + "/" + entry.getName(); 38 File dir = new File(dirPath); 39 dir.mkdirs(); 40 } else { 41 // 如果是文件,就先创建一个文件,然后用io流把内容copy过去 42 File targetFile = new File(destDirPath + "/" + entry.getName()); 43 // 保证这个文件的父文件夹必须要存在 44 if(!targetFile.getParentFile().exists()){ 45 targetFile.getParentFile().mkdirs(); 46 } 47 targetFile.createNewFile(); 48 // 将压缩文件内容写入到这个文件中 49 InputStream is = zipFile.getInputStream(entry); 50 FileOutputStream fos = new FileOutputStream(targetFile); 51 int len; 52 byte[] buf = new byte[BUFFER_SIZE]; 53 while ((len = is.read(buf)) != -1) { 54 fos.write(buf, 0, len); 55 } 56 // 关流顺序,先打开的后关闭 57 fos.close(); 58 is.close(); 59 } 60 } 61 long end = System.currentTimeMillis(); 62 LOGGER.info("解压完成,耗时:" + (end - start) +" ms"); 63 } catch (Exception e) { 64 LOGGER.error(e.getMessage()); 65 } finally { 66 if(zipFile != null){ 67 try { 68 zipFile.close(); 69 } catch (IOException e) { 70 e.printStackTrace(); 71 } 72 } 73 } 74 } 75 76 /** 77 * 压缩成ZIP 方法 78 * @param srcFiles 需要压缩的文件列表 79 * @param out 压缩文件输出流 80 * @throws RuntimeException 压缩失败会抛出运行时异常 81 */ 82 public static void toZip(List<File> srcFiles , OutputStream out)throws Exception { 83 long start = System.currentTimeMillis(); 84 ZipOutputStream zos = null ; 85 try { 86 zos = new ZipOutputStream(out); 87 for (File srcFile : srcFiles) { 88 byte[] buf = new byte[BUFFER_SIZE]; 89 zos.putNextEntry(new ZipEntry(srcFile.getName())); 90 int len; 91 FileInputStream in = new FileInputStream(srcFile); 92 while ((len = in.read(buf)) != -1){ 93 zos.write(buf, 0, len); 94 } 95 zos.closeEntry(); 96 in.close(); 97 } 98 long end = System.currentTimeMillis(); 99 LOGGER.info("解压完成,耗时:" + (end - start) +" ms"); 100 } catch (Exception e) { 101 LOGGER.error(e.getMessage()); 102 }finally{ 103 if(zos != null){ 104 try { 105 zos.close(); 106 } catch (Exception e) { 107 e.printStackTrace(); 108 } 109 } 110 } 111 } 112 }
递归删除文件夹及文件的方法:
1 public void deleteFloderAndFile(File file) { 2 if (!file.exists()) { 3 return; 4 } 5 if (null == file.list() || file.isFile()) { 6 LOGGER.info("删除文件"+file.getName()); 7 file.delete(); 8 } else { 9 File[] files = file.listFiles(); 10 for (File f : files) { 11 deleteFloderAndFile(f); 12 } 13 file.delete(); 14 } 15 }