Java实现批量下载选中文件功能

1.在action中定义变量

1
2
3
4
5
6
private List<String> downLoadPaths = new ArrayList<String>();//存储选中文件的下载地址
private OutputStream res;
private ZipOutputStream zos;
private String outPath;
private String lessionIdStr;// 选中文件ID拼接的字符串
private String fileName; //浏览器下载弹出框中显示的文件名

  分别给出get和set方法

2.  主方法 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/**
   * 下载多个文件:压缩成zip
   *
   * @return
   * @throws Exception
   */
  public String downLoadLessionsZip() {
    downLoadPaths.clear();
    String firstFileName = "";// 第一个文件的文件名
    List<DownLoadFileVo> fileVos = new LinkedList<DownLoadFileVo>();
    if (StringUtils.isNotEmpty(lessionIdStr)) {
      int end = lessionIdStr.lastIndexOf(",");
      if (end > 0) {
        if (end == lessionIdStr.length() - 1) {
          lessionIdStr = lessionIdStr.substring(0, end);
        }
        String[] ids = lessionIdStr.split(",");
        for (int i = 0; i < ids.length; i++) {
          if (StringUtils.isNumeric(ids[i])) {
            BkPersonLession lession = bkPersonLessionService.downLoadLession(Integer.parseInt(ids[i]));
            if (lession != null) {
              fileVos.add(new DownLoadFileVo(lession
                  .getLessionName(), getContextRealPath()
                  + lession.getLessionSavePath()));
              downLoadPaths.add(getContextRealPath()
                  + lession.getLessionSavePath());
            }
            if (i == 0) {              
                       firstFileName = lession.getLessionName();
            }
          }
        }
      }
    }
    // 有数据可以下载
    if (downLoadPaths.size() != 0) {
      // 进行预处理
      preProcess(firstFileName);
    } else {
      // 没有文件可以下载,返回nodata
      return "nodata";
    }
    // 处理
    writeZip(fileVos);
    // 后处理关闭流
    afterProcess();
    return null;
  }
  // 压缩处理
  public void writeZip(List<DownLoadFileVo> fileVos) {
    byte[] buf = new byte[8192];
    int len;
    for (DownLoadFileVo fileVo : fileVos) {
      File file = new File(fileVo.getFileSavePath());
      if (!file.isFile())
        continue;
      ZipEntry ze = new ZipEntry(fileVo.getFileName()
          + fileVo.getFileSavePath().substring(
              fileVo.getFileSavePath().lastIndexOf(".")));                          
      try {
        zos.putNextEntry(ze);
        BufferedInputStream bis = new BufferedInputStream(
            new FileInputStream(file));
        while ((len = bis.read(buf)) > 0) {
          zos.write(buf, 0, len);
        }
        bis.close();
        zos.closeEntry();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
  // 预处理
  public void preProcess(String firseFileName) {
    String zipName = "【批量下载】" + firseFileName + "等.zip";
    String filename = "";
    try {
      filename = new String(zipName.getBytes("GBK"), "8859_1");
    } catch (UnsupportedEncodingException e1) {
      e1.printStackTrace();
    }
    this.fileName = filename;
    HttpServletResponse response = ServletActionContext.getResponse();
    try {
      res = response.getOutputStream();
      // 清空输出流(在迅雷下载不会出现一长窜)
      response.reset();
      // 设定输出文件头
      response.setHeader("Content-Disposition", "attachment;fileName="
          + filename);
      response.setContentType("application/zip");
      zos = new ZipOutputStream(res);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  // 后处理
  public void afterProcess() {
    try {
      if (zos != null) {
        zos.close();
      }
      if (res != null) {
        res.close();
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

3. 在struts.xml中配置

1
2
3
4
5
6
<action name="downLoadBkPersonLessionsZip" class="bkPersonLessionAction" 
      method="downLoadLessionsZip">//class值为bean.xml中配置的bean
  <result name="nodata" type="httpheader">
    <param name="status">204</param>//表示响应执行成功,但没有数据返回,浏览器不用刷新,不用导向新页面
  </result>
</action>

  用到的jar包

DEMO下载地址:https://dwz.cn/Jw3z6fVq

原文地址:https://www.cnblogs.com/xproer/p/10794345.html