zoukankan      html  css  js  c++  java
  • 【Java】Java批量文件打包下载zip

    网上看了很多,本文使用ant.jar中的org.apache.tools.zip,页面用js表单提交

    代码供参考:

    ACTION:

      1 /*
      2      * 另存为
      3      */
      4     @RequestMapping("/saveAs.do")
      5     public @ResponseBody
      6     void saveAs(String filePath, String fileName) {
      7 
      8         try {
      9             File file = new File(filePath);
     10             // 设置文件MIME类型
     11             getResponse().setContentType(getMIMEType(file));
     12             // 设置Content-Disposition
     13             getResponse().setHeader(
     14                     "Content-Disposition",
     15                     "attachment;filename="
     16                             + URLEncoder.encode(fileName, "UTF-8"));
     17             // 获取目标文件的绝对路径
     18             String fullFileName = getRealPath("/upload/" + filePath);
     19             // System.out.println(fullFileName);
     20             // 读取文件
     21             InputStream ins = new FileInputStream(fullFileName);
     22             // 放到缓冲流里面 
     23             BufferedInputStream bins = new BufferedInputStream(ins);
     24             // 获取文件输出IO流  
     25             // 读取目标文件,通过response将目标文件写到客户端
     26             OutputStream outs = getResponse().getOutputStream();
     27             BufferedOutputStream bouts = new BufferedOutputStream(outs);  
     28             // 写文件
     29              int bytesRead = 0;  
     30              byte[] buffer = new byte[8192];  
     31              // 开始向网络传输文件流  
     32              while ((bytesRead = bins.read(buffer, 0, 8192)) != -1) {  
     33                  bouts.write(buffer, 0, bytesRead);  
     34              }  
     35              bouts.flush();// 这里一定要调用flush()方法  
     36              ins.close();  
     37              bins.close();  
     38              outs.close();  
     39              bouts.close();  
     40         } catch (Exception e) {
     41             e.printStackTrace();
     42         }
     43     }
     44 
     45     /*
     46      * 批量下载另存为
     47      */
     48     @RequestMapping("/batDownload.do")
     49     public @ResponseBody
     50     void batDownload(String filePaths, String fileNames) {
     51         String tmpFileName = "work.zip";  
     52         byte[] buffer = new byte[1024];  
     53         String strZipPath = getRealPath("/upload/work/"+tmpFileName);
     54         try {
     55             ZipOutputStream out = new ZipOutputStream(new FileOutputStream(  
     56                         strZipPath));  
     57             String[] files=filePaths.split("\|",-1);
     58             String[] names=fileNames.split("\|",-1);
     59             // 下载的文件集合
     60             for (int i = 0; i < files.length; i++) {  
     61                 FileInputStream fis = new FileInputStream(getRealPath("/upload/"+files[i]));  
     62                 out.putNextEntry(new ZipEntry(names[i])); 
     63                  //设置压缩文件内的字符编码,不然会变成乱码  
     64                 out.setEncoding("GBK");  
     65                 int len;  
     66                 // 读入需要下载的文件的内容,打包到zip文件  
     67                 while ((len = fis.read(buffer)) > 0) {  
     68                     out.write(buffer, 0, len);  
     69                 }  
     70                 out.closeEntry();  
     71                 fis.close();  
     72             }
     73              out.close();  
     74              saveAs("work/"+tmpFileName, tmpFileName);  
     75 
     76         } catch (Exception e) {
     77             e.printStackTrace();
     78         }
     79     }
     80 
     81     /**
     82      * 根据文件后缀名获得对应的MIME类型。
     83      * 
     84      * @param file
     85      */
     86     private String getMIMEType(File file) {
     87         String type = "*/*";
     88         String fName = file.getName();
     89         // 获取后缀名前的分隔符"."在fName中的位置。
     90         int dotIndex = fName.lastIndexOf(".");
     91         if (dotIndex < 0) {
     92             return type;
     93         }
     94         /* 获取文件的后缀名 */
     95         String end = fName.substring(dotIndex, fName.length()).toLowerCase();
     96         if (end == "")
     97             return type;
     98         // 在MIME和文件类型的匹配表中找到对应的MIME类型。
     99         for (int i = 0; i < MIME_MapTable.length; i++) {
    100             if (end.equals(MIME_MapTable[i][0]))
    101                 type = MIME_MapTable[i][1];
    102         }
    103         return type;
    104     }
    105 
    106     private final String[][] MIME_MapTable = {
    107             // {后缀名, MIME类型}
    108             { ".doc", "application/msword" },
    109             { ".docx",
    110                     "application/vnd.openxmlformats-officedocument.wordprocessingml.document" },
    111             { ".xls", "application/vnd.ms-excel" },
    112             { ".xlsx",
    113                     "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" },
    114             { ".pdf", "application/pdf" },
    115             { ".ppt", "application/vnd.ms-powerpoint" },
    116             { ".pptx",
    117                     "application/vnd.openxmlformats-officedocument.presentationml.presentation" },
    118             { ".txt", "text/plain" }, { ".wps", "application/vnd.ms-works" },
    119             { "", "*/*" } };
    120 };

    <
    form id="batForm" action="<%=path%>/file/batDownload.do" method="post"> <input type="hidden" id="filePaths" name="filePaths" value=""/> <input type="hidden" id="fileNames" name="fileNames" value=""/> </form>
    function download(){
            var objs=$("#fileFrame").contents().find("input[name='ckFile']:checked");        
            if(objs.length>0){
                var filePaths="";
                var fileNames="";
                for(var i=0;i<objs.length;i++){                
                    filePaths+=$("#fileFrame").contents().find("#path_"+objs[i].value).val()+"|";
                    fileNames+=$("#fileFrame").contents().find("#a_"+objs[i].value).html()+"|";
                }
                filePaths=filePaths.substring(0,filePaths.length-1);
                fileNames=fileNames.substring(0,fileNames.length-1);
                $("#filePaths").val(filePaths);
                $("#fileNames").val(fileNames);
                $("#batForm").submit();
            }else{
                alert("请选择需要下载的文件!");
                return false;
            }
        }
    持之以恒
  • 相关阅读:
    Delphi XE4 FireMonkey 开发 IOS APP 发布到 AppStore 最后一步.
    Native iOS Control Delphi XE4
    Delphi XE4 iAD Framework 支持.
    using IOS API with Delphi XE4
    GoF23种设计模式之行为型模式之命令模式
    Android青翼蝠王之ContentProvider
    Android白眉鹰王之BroadcastReceiver
    Android倚天剑之Notification之亮剑IOS
    Android紫衫龙王之Activity
    GoF23种设计模式之行为型模式之访问者模式
  • 原文地址:https://www.cnblogs.com/zwqh/p/6264425.html
Copyright © 2011-2022 走看看