Struts2 动态压缩成zip文件下载

fmms 13年前
     功能:文件下载    <br /> 简述:    <br /> 1.根据画面上的复选框进行文件打包下载    <br /> 2.待下载文件保存在服务器的硬盘上,打包过程中不生成临时文件    <br /> 3.打包过程中需要动态创建一个txt文件一并打进zip包中    <br /> 4.页面上没有文件被选择的场合,按下【下载】按钮后,什么都不做(不刷新页面)    <br />    <br /> 部分内容参考自互联网,如果错误,欢迎指正。    <br />    <br /> Struts配置文件    <br />    <pre class="brush:xml; toolbar: true; auto-links: false;"> <!-- 数据下载Action --> <action name="downloadWaveData" class="DownloadAction">  <result name="nodata" type="httpheader">   <param name="status">204</param>  </result> </action></pre>    <br />    <br /> Action代码    <br />    <pre class="brush:java; toolbar: true; auto-links: false;"> private OutputStream res;  private ZipOutputStream zos;   // action的主方法  public String execute() throws Exception {       if (有数据可下载) {;    // 预处理    preProcess();    } else {    // 没有文件可下载的场合,返回nodata,设定参照struts配置文件    return "nodata";   }    // 在这里编辑好需要下载的数据   // 文件可以是硬盘上的   // 文件也可以是自己写得数据流,如果是自己写得数据流,请参看outputZipFile方法中的【2.】   File file = new File();   file = ...   outputZipFile(file);      // 后处理   afterProcess();      return null;    }   // 预处理  public void preProcess() throws Exception {      HttpServletResponse response = ServletActionContext.getResponse();      res = response.getOutputStream();    //清空输出流    response.reset();       //设定输出文件头    response.setHeader("Content-disposition ","attachment; filename=a.zip ");      response.setContentType("application/zip");   zos = new ZipOutputStream(res);     }   // 后处理  public void afterProcess() throws Exception {   zos.close();   res.close();  }   // 写文件到客户端  private void outputZipFile(File file) throws IOException, FileNotFoundException {   ZipEntry ze = null;   byte[] buf = new byte[1024];      int readLen = 0;      File file = (File)fileList.get(i);      // 1.动态压缩一个File到zip中   // 创建一个ZipEntry,并设置Name和其它的一些属性   // 压缩包中的路径和文件名称   ze = new ZipEntry("1\\1" + f.getName());   ze.setSize(file.length());   ze.setTime(file.lastModified());    // 将ZipEntry加到zos中,再写入实际的文件内容   zos.putNextEntry(ze);   InputStream is = new BufferedInputStream(new FileInputStream(file));    // 把数据写入到客户端   while ((readLen = is.read(buf, 0, 1024)) != -1) {    zos.write(buf, 0, readLen);   }   is.close();      // 2.动态压缩一个String到zip中   String customFile = "This is a text file.";    // 压缩包中的路径和文件名称   ZipEntry cze = new ZipEntry(“1\\1\\” + "Test.txt");   zos.putNextEntry(cze);    // 利用ByteArrayInputStream把流数据写入到客户端   is = new ByteArrayInputStream(customFile.getBytes());   while ((readLen = is.read(buf, 0, 1024)) != -1) {    zos.write(buf, 0, readLen);   }     }</pre>    <br /> 转自:    <a href="/misc/goto?guid=4959500518411297764" target="_blank">http://tjmljw.iteye.com/blog/1338598</a>