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     }

 

 
posted @ 2020-09-02 10:07  zhaojunjin  阅读(809)  评论(0编辑  收藏  举报