经常遇到选择多个文件进行批量下载的情况,可以先将选择的所有的文件生成一个zip文件,然后再下载,该zip文件,即可实现批量下载,但是在打包过程中,常常也会出现下载过来的zip文件中里面有乱码的文件名,通过使用ant.jar中的org.apache.tools.zip里的ZipOutPutStream为实现编码的设置。 
代码如下:

ant包引用

  1. <span style="font-size:14px">Xml代码
  2. <dependency>
  3. <groupId>ant</groupId>
  4. <artifactId>ant</artifactId>
  5. <version>1.6.5</version>
  6. </dependency>  </span>

压缩下载的action代码

  1. <span style="font-size:14px">package demo.action;
  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedOutputStream;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8. import java.io.InputStream;
  9. import java.io.OutputStream;
  10. import java.net.URLEncoder;
  11. import javax.servlet.http.HttpServletResponse;
  12. import org.apache.log4j.Logger;
  13. import org.apache.struts2.ServletActionContext;
  14. import org.apache.tools.zip.ZipEntry;
  15. import org.apache.tools.zip.ZipOutputStream;
  16. import com.opensymphony.xwork2.ActionSupport;
  17. /**
  18. * 批量下载文件:
  19. *   使用ant.jar包中的org.apache.tools.zip.*完成压缩,
  20. * java原生也有java.util.zip.*但是测试了下无法搞定压缩
  21. * 文件内文件名的中文问题
  22. * @author yangcong
  23. *
  24. */
  25. public class BatchDownloadAction extends ActionSupport {
  26. private Logger Log = Logger.getLogger(BatchDownloadAction.class);
  27. private static final String FilePath = "D:\\";
  28. private static final long serialVersionUID = -8694640030455344419L;
  29. public String execute() {
  30. //生成的ZIP文件名为Demo.zip
  31. String tmpFileName = "Demo.zip";
  32. byte[] buffer = new byte[1024];
  33. String strZipPath = FilePath + tmpFileName;
  34. try {
  35. ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
  36. strZipPath));
  37. // 需要同时下载的两个文件result.txt ,source.txt
  38. File[] file1 = { new File(FilePath+"test1.txt"),
  39. new File(FilePath+"测试2.docx") };
  40. for (int i = 0; i < file1.length; i++) {
  41. FileInputStream fis = new FileInputStream(file1[i]);
  42. out.putNextEntry(new ZipEntry(file1[i].getName()));
  43. //设置压缩文件内的字符编码,不然会变成乱码
  44. out.setEncoding("GBK");
  45. int len;
  46. // 读入需要下载的文件的内容,打包到zip文件
  47. while ((len = fis.read(buffer)) > 0) {
  48. out.write(buffer, 0, len);
  49. }
  50. out.closeEntry();
  51. fis.close();
  52. }
  53. out.close();
  54. this.downFile(getResponse(), tmpFileName);
  55. } catch (Exception e) {
  56. Log.error("文件下载出错", e);
  57. }
  58. return null;
  59. }
  60. /**
  61. * 获取Response
  62. * @return
  63. */
  64. private HttpServletResponse getResponse() {
  65. return ServletActionContext.getResponse();
  66. }
  67. /**
  68. * 文件下载
  69. * @param response
  70. * @param str
  71. */
  72. private void downFile(HttpServletResponse response, String str) {
  73. try {
  74. String path = FilePath + str;
  75. File file = new File(path);
  76. if (file.exists()) {
  77. InputStream ins = new FileInputStream(path);
  78. BufferedInputStream bins = new BufferedInputStream(ins);// 放到缓冲流里面
  79. OutputStream outs = response.getOutputStream();// 获取文件输出IO流
  80. BufferedOutputStream bouts = new BufferedOutputStream(outs);
  81. response.setContentType("application/x-download");// 设置response内容的类型
  82. response.setHeader(
  83. "Content-disposition",
  84. "attachment;filename="
  85. + URLEncoder.encode(str, "UTF-8"));// 设置头部信息
  86. int bytesRead = 0;
  87. byte[] buffer = new byte[8192];
  88. // 开始向网络传输文件流
  89. while ((bytesRead = bins.read(buffer, 0, 8192)) != -1) {
  90. bouts.write(buffer, 0, bytesRead);
  91. }
  92. bouts.flush();// 这里一定要调用flush()方法
  93. ins.close();
  94. bins.close();
  95. outs.close();
  96. bouts.close();
  97. } else {
  98. response.sendRedirect("../error.jsp");
  99. }
  100. } catch (IOException e) {
  101. Log.error("文件下载出错", e);
  102. }
  103. }
  104. }
  105. 经过在windows环境下测试通过,使用struts2</span>

http://blog.csdn.net/clare504/article/details/11962263/

Java批量文件打包下载的更多相关文章

  1. Java批量文件打包下载zip

    网上看了很多,本文使用ant.jar中的org.apache.tools.zip,页面用js表单提交 代码供参考: ACTION: /* * 另存为 */ @RequestMapping(" ...

  2. 【Java】Java批量文件打包下载zip

    网上看了很多,本文使用ant.jar中的org.apache.tools.zip,页面用js表单提交 代码供参考: ACTION: /*      * 另存为      */     @Request ...

  3. PHP扩展类ZipArchive实现压缩解压Zip文件和文件打包下载 && Linux下的ZipArchive配置开启压缩 &&搞个鸡巴毛,写少了个‘/’号,浪费了一天

    PHP ZipArchive 是PHP自带的扩展类,可以轻松实现ZIP文件的压缩和解压,使用前首先要确保PHP ZIP 扩展已经开启,具体开启方法就不说了,不同的平台开启PHP扩增的方法网上都有,如有 ...

  4. PHP 多文件打包下载 zip

    <?php $zipname = './photo.zip'; //服务器根目录下有文件夹public,其中包含三个文件img1.jpg, img2.jpg, img3.jpg,将这三个文件打包 ...

  5. java 实现多文件打包下载

    jsp页面js代码: function downloadAttached(){ var id = []; id.push(infoid); var options = {}; options.acti ...

  6. java原生文件打包

    一.背景 前端时间,自己做的项目需要打包功能,不想再引外部的jar包 便用java.util.zip做了下该功能 二.适用场景 生成多个word.excel.xml等文件,并要求打包下载的情形 例:项 ...

  7. java将文件打包成ZIP压缩文件的工具类实例

    package com.lanp; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ja ...

  8. flask BytesIO() 多个文件打包下载 zipfile

    使用zipfile模块可以将多个文件打包成zip文件进行下载,但是常规的操作方式会在服务器磁盘上生成一个zip文件占用磁盘空间. 后引入BytesIO将文件写入到内存中然后下载: def dl_pla ...

  9. servlet实现多文件打包下载

    当用户一次下载多个文件时.普通情况是,每下载一个文件,均要弹出一个下载的对话框.这给用户造成了非常大不便. 比較理想的情况是,用户选择多个文件后.server后端直接将多个文件打包为zip.以下贴出实 ...

随机推荐

  1. 《JavaScript高级程序设计》 - 读书笔记 - 第4章 变量、作用域和内存问题

    4.1 基本类型和引用类型的值 JavaScript变量是松散类型的,它只是保存特定值的一个名字而已. ECMAScript变量包含两种数据类型的值:基本类型值和引用类型值.基本类型值指的是简单的数据 ...

  2. MyBatis的foreach标签与SUM函数同时使用

    最近在项目中遇到一个,需要根据传入的存有id的list,计算值,再起别名 <if test="channelList != null and channelList.size()> ...

  3. Mysql连表之多对多

    说明 这里的文章是接着前面 Mysql连表一对多 写的. 连表多对多 可以理解成一夫多妻和一妻多夫. 男人表: nid name 1 xxx 2 yyy 3 zzz 女人表: nid name 1 a ...

  4. BZOJ1572 工作安排 USACO2009

    描述 Description     Farmer John 有太多的工作要做啊!!!!!!!!为了让农场高效运转,他必须靠他的工作赚钱,每项工作花一个单位时间.他的工作日从0时刻开始,有100000 ...

  5. <<< 如何查看自己是外网还是内网

    判断的方法很简单,就是看你的网络中有没有路由器,不管是有线路由还是无线路由,只要你的网络中用了路由,那你就是内网,用路由器的网络有一个特点,那就是只要路由器在开着,那你开了电脑之后就可以直接上网,不需 ...

  6. ubuntu下升级R版本

    ubuntu下升级R版本   在测试<机器学习 实用案例解析>一书的邮件分类代码时,windows系统下rstudio中无法读取特殊字符,在ubuntu下可以.在ubuntu虚拟机下安装t ...

  7. Hibernate映射文件如何配置触发器

    Hibernate映射文件之触发器生成(generated属性.database-object元素) (2013-02-27 12:28:49) 转载▼ 标签: it 分类: JAVA学习笔记 这里分 ...

  8. Zabbix 监控 Nginx(四)

    简介: 如何使用 Zabbix 监控 Nginx 状态 ? 1.获取 Nginx 状态( HTTP Stub Status ) [root@localhost ~]# /apps/product/ng ...

  9. php如何防止图片盗用/盗链的两种方法

    如今的互联网,采集网站非常多,很多网站都喜欢盗链/盗用别人网站的图片,这样不仅侵犯网权,还导致被盗链的网站消耗大量的流量,给服务器造成比较大的压力,本文章向大家介绍php如何防止图片盗用/盗链的两种方 ...

  10. 脑筋急转弯——Google 面试

    1. 村子里有100对夫妻,其中每个丈夫都瞒着自己的妻子偷情...村里的每个妻子都能立即发现除自己丈夫之外的其他男人是否偷情,唯独不知道她自己的丈夫到底有没有偷情.村里的规矩不容忍通奸.任何一个妻子, ...