• 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

  • 相关阅读:
    golang 用tar打包文件或文件夹
    golang 最和谐的子序列
    golang 轮训加密算法
    golang map
    golang 队列
    golang 栈操作
    golang 多维数组
    golang 数组反转
    c# sendmessage control to scroll
    c# 启动的时候向其他程序传值
  • 原文地址:https://www.cnblogs.com/xproer/p/10794345.html
Copyright © 2020-2023  润新知