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

 更新时间:2017年11月21日 09:45:48   作者:秋分中的雨  
这篇文章主要介绍了Java实现批量下载选中文件功能,非常不错,具有参考借鉴价值,需要的朋友可以参考下

1.在action中定义变量

 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.  主方法 

/** 
   * 下载多个文件:压缩成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中配置

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

  用到的jar包

总结

以上所述是小编给大家介绍的Java实现批量下载选中文件功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Mybatis如何一次性插入多条数据

    Mybatis如何一次性插入多条数据

    这篇文章主要介绍了Mybatis如何一次性插入多条数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Spring Boot3.x自动配置不生效的排查与解决方法(IDEA 文件夹命名导致的问题)

    Spring Boot3.x自动配置不生效的排查与解决方法(IDEA 文件夹命名导致的问题)

    在SpringBoot多模块项目中,自动配置类未生效的问题通常源于文件路径错误,通过检查和修正AutoConfiguration.imports文件的实际路径,可以解决自动配置不生效的问题,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • SpringBoot详细探究讲解默认组件扫描

    SpringBoot详细探究讲解默认组件扫描

    在项目中我们创建了Controller,这个Controller是如何被spring自动加载的呢?为什么Controller必须放在启动类的同级目录下呢
    2022-06-06
  • 分析JVM的执行子系统

    分析JVM的执行子系统

    本文主要介绍了JVM执行子系统。了解虚拟机是如何执行程序的, 虚拟机怎样运行一个Class文件的概念模型, 可以更好的理解怎样写出优秀的代码
    2021-06-06
  • Java并发编程中的ConcurrentLinkedQueue详解

    Java并发编程中的ConcurrentLinkedQueue详解

    这篇文章主要介绍了Java并发编程中的ConcurrentLinkedQueue详解,GetThread线程不会因为ConcurrentLinkedQueue队列为空而等待,而是直接返回null,所以当实现队列不空时,等待时,则需要用户自己实现等待逻辑,需要的朋友可以参考下
    2023-12-12
  • MyBatis自定义映射resultMap的实现

    MyBatis自定义映射resultMap的实现

    本文主要介绍了MyBatis自定义映射resultMap的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • 详解基于MVC的数据查询模块进行模糊查询

    详解基于MVC的数据查询模块进行模糊查询

    这篇文章主要介绍了Java基于MVC的数据查询模块进行模糊查询,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • 基于Java实现模板填充Word

    基于Java实现模板填充Word

    这篇文章主要为大家详细介绍了如何用 Java 实现按产品经理提供的 Word 模板填充数据,并以 word 或 pdf 形式导出,有需要的小伙伴可以参考一下
    2025-01-01
  • springboot serverEndpoint导致@resource注解不生效

    springboot serverEndpoint导致@resource注解不生效

    在SpringBoot中,@Resource注解用于注入依赖,本文主要介绍了springboot serverEndpoint导致@resource注解不生效,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • Java加载properties文件实现方式详解

    Java加载properties文件实现方式详解

    这篇文章主要介绍了Java加载properties文件实现方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07

最新评论