Struts2复选框多文件下载

来源:互联网 发布:淘宝怎么买二手东西 编辑:程序博客网 时间:2024/06/07 02:47

使用场景:

  1)在JSP页面,有一个展现附件的列表。

  2)对列表中的每一个附件,提供单独下载。

  3)同时提供复选框,提供选择多个文件下载。

  实现思路:

  1)写一个通用的具有下载功能的Action,只需要接收一个文件路径就可以下载。单个附件的下载直接调用这个Action,只需要传递附件的路径即可。

  2)多个文件下载,可以将多个文件的路径传递到一个处理Action,将多个文件打包成zip。然后重定向到通用的下载Action,同时传递zip包的路径给通用下载Action。


  1、通用的下载Action。

  这个Action里面有一个成员变量fileName,负责接收传递的文件路径。

[java] view plain copy
  1.  package cn.luxh.struts2.action;   
  2.     
  3. import java.io.BufferedInputStream;   
  4. import java.io.FileInputStream;   
  5. import java.io.FileNotFoundException;   
  6. import java.io.InputStream;   
  7. import java.io.UnsupportedEncodingException;   
  8.     
  9. import javax.servlet.http.HttpServletResponse;   
  10.     
  11. import org.apache.struts2.ServletActionContext;   
  12.     
  13. import com.opensymphony.xwork2.ActionSupport;   
  14.     
  15.     
  16. /**  
  17.  * 文件下载  
  18.  * @author Luxh  
  19.  */  
  20. public class DownloadAction extends ActionSupport {   
  21.     
  22.     
  23.     private static final long serialVersionUID = -3036349171314867490L;   
  24.         
  25.     //文件名   
  26.     private String fileName;   
  27.         
  28.     public String getFileName() {   
  29.         return fileName;   
  30.     }   
  31.     
  32.     public void setFileName(String fileName) throws UnsupportedEncodingException {   
  33.         //用UTF-8重新编码文件名,解决中文乱码   
  34.         this.fileName = new String(fileName.getBytes("ISO-8859-1"),"UTF-8");   
  35.     }   
  36.         
  37.     public InputStream getInputStream() throws UnsupportedEncodingException, FileNotFoundException{   
  38.         HttpServletResponse response = ServletActionContext.getResponse();   
  39.         //attachment,以附件的方式下载文件,会打开保存文件对话框;inline,以内联的方式下载,浏览器会直接打开文件   
  40.         response.setHeader("Content-Disposition""attachment;fileName="  
  41.                   + java.net.URLEncoder.encode(fileName,"UTF-8"));//java.net.URLEncoder.encode(fileName,"UTF-8")  编码转换,解决乱码   
  42.              
  43.         //如果fileName是相对路径   
  44.         //return ServletActionContext.getServletContext().getResourceAsStream(fileName);   
  45.         //如果fileName是绝对路径   
  46.         return new BufferedInputStream(new FileInputStream(fileName));   
  47.     }   
  48.         
  49.     @Override  
  50.     public String execute() throws Exception {   
  51.         return SUCCESS;   
  52.     }   
  53.         
  54.         
  55.     
  56. }   
这个Action的配置文件:

[java] view plain copy
  1. <?xml version="1.0" encoding="UTF-8" ?>   
  2. <!DOCTYPE struts PUBLIC   
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"   
  4.     "http://struts.apache.org/dtds/struts-2.3.dtd">   
  5.     
  6. <struts>   
  7.     <package name="download" namespace="/download" extends="default">   
  8.             
  9.          <action name="download" class="cn.luxh.struts2.action.DownloadAction">   
  10.             <result name="success" type="stream">   
  11.                  <!-- 下载文件类型定义 -->   
  12.                  <param name="contentType">application/octet-stream</param>   
  13.                  <!-- 下载文件输出流定义 -->   
  14.                  <param name="inputName">inputStream</param>   
  15.                  <!-- 下载文件的缓冲大小 -->  
  16.                  <param name="bufferSize">4096</param>   
  17.             </result>   
  18.         </action>   
  19.             
  20.     </package>   
  21. </struts>  

2、处理多个附件下载的Action。

[java] view plain copy
  1. package cn.luxh.struts2.action;   
  2.     
  3. import java.io.File;   
  4. import java.text.SimpleDateFormat;   
  5. import java.util.Date;   
  6.     
  7. import cn.luxh.utils.ZipFileUtil;   
  8.     
  9. import com.opensymphony.xwork2.ActionSupport;   
  10.     
  11. /**  
  12.  * 处理多个附件下载  
  13.  * @author Luxh  
  14.  */  
  15. public class MultiFileDownloadAction extends ActionSupport {   
  16.     
  17.     private static final long serialVersionUID = 2743077909387361587L;   
  18.         
  19.     //接收JSP页面传递过来的附件的路径   
  20.     private String attachmentPath;    
  21.         
  22.     //最终压缩后的zip文件的路径,传递给通用的下载Action   
  23.     private String fileName;   
  24.     
  25.         
  26.     /**  
  27.      * 下载多个附件  
  28.      * 实现:将多个附近压缩成zip包,然后再下载zip包  
  29.      */  
  30.     public String downloadMultiFile() {   
  31.         //使用当前时间生成文件名称   
  32.         String formatDate =new  SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());   
  33.         //压缩后的zip文件存放路径   
  34.         fileName = "D:/test/" + formatDate + ".zip";   
  35.             
  36.         if(attachmentPath != null && !"".equals(attachmentPath)) {   
  37.             //将多个附件的路径取出   
  38.             String[] attachmentPathArray = attachmentPath.split(",");   
  39.             if(attachmentPathArray != null && attachmentPathArray.length >0) {   
  40.                 File[] files = new File[attachmentPathArray.length];   
  41.                 for(int i=0;i<attachmentPathArray.length;i++) {   
  42.                     if(attachmentPathArray[i] != null) {   
  43.                         File file = new File(attachmentPathArray[i].trim());   
  44.                         if(file.exists()) {   
  45.                             files[i] = file;   
  46.                         }   
  47.                     }   
  48.                 }   
  49.                 //将多个附件压缩成zip   
  50.                 ZipFileUtil.compressFiles2Zip(files,fileName);   
  51.             }   
  52.                 
  53.         }   
  54.         return SUCCESS;   
  55.     }   
  56.         
  57.         
  58.     public String getAttachmentPath() {   
  59.         return attachmentPath;   
  60.     }   
  61.     public void setAttachmentPath(String attachmentPath) {   
  62.         this.attachmentPath = attachmentPath;   
  63.     }   
  64.     public String getFileName() {   
  65.         return fileName;   
  66.     }   
  67.     public void setFileName(String fileName) {   
  68.         this.fileName = fileName;   
  69.     }   
  70.         
  71.         
  72.     
  73. }  

 Action中的压缩文件类ZipFileUtil参考 http://www.cnblogs.com/luxh/archive/2012/06/28/2568758.html

  配置文件:

[java] view plain copy
  1. <!--将多个附件压缩后重定向到公共的下载Action下载文件  -->  
  2.         <action name="downloadMultiFile" class="cn.luxh.struts2.action.MultiFileDownloadAction" method="downloadMultiFile">   
  3.            <result type="redirectAction">   
  4.                <param name="actionName">download</param>   
  5.                <param name="nameSpace">/download</param>   
  6.                <!--附件的完整路径  -->  
  7.                <param name="fileName">${fileName}</param>   
  8.            </result>   
  9.        </action>  

3、附件列表展现的JSP页面。

[java] view plain copy
  1. <%@ page contentType="text/html;charset=UTF-8" language="java"%>   
  2. <%@ taglib prefix="s" uri="/struts-tags"%>   
  3. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>   
  4. <!DOCTYPE html>   
  5. <html>   
  6.     <head>   
  7.     <title>File Download</title>   
  8.         
  9.     <meta http-equiv="description" content="error">   
  10.     <meta http-equiv="content-type" content="text/html; charset=UTF-8">   
  11.         
  12.     <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->  
  13.         
  14.     <script type="text/javascript" src="${pageContext.request.contextPath}/scripts/jquery-1.7.2.min.js"></script>   
  15.     <script type="text/javascript">   
  16.         function checkFile() {   
  17.             if($("#all").attr("checked")){   
  18.                 $("input[name='attachmentPath']").attr("checked",true);   
  19.             }else {   
  20.                 $("input[name='attachmentPath']").attr("checked",false);   
  21.             }   
  22.         }   
  23.             
  24.     </script>   
  25.     </head>   
  26.     
  27.     <body>   
  28.         
  29.         <form  action="${pageContext.request.contextPath}/index/downloadMultiFile" method="post">   
  30.             <table>   
  31.                  <tr>   
  32.                      <th>   
  33.                             <input type="checkbox" name="all" id="all" onchange="checkFile()">全选   
  34.                      </th>   
  35.                       <th>   
  36.                             文件名   
  37.                      </th>   
  38.                       <th>   
  39.                             文件路径   
  40.                      </th>   
  41.                       <th>   
  42.                             下载   
  43.                      </th>   
  44.                  </tr>   
  45.                 <c:forEach items="${attachmentList}" var="attachment">   
  46.                     <tr>   
  47.                         <td>   
  48.                             <input type="checkbox" name="attachmentPath" value="${attachment.filePath}">   
  49.                         </td>   
  50.                         <td>${attachment.fileName}</td>   
  51.                         <td>${attachment.filePath}</td>   
  52.                         <td>   
  53.                             <a href="${pageContext.request.contextPath}/download/download?fileName=${attachment.filePath}">下载</a>   
  54.                         </td>   
  55.                     </tr>   
  56.                 </c:forEach>   
  57.             </table>   
  58.             <tr>   
  59.                 <td>   
  60.                     <input type="submit" value="下载所选文件" id="submit">   
  61.                 </td>   
  62.             </tr>   
  63.         </form>   
  64.             
  65.     </body>   
  66. </html>  

0 0