多个文件,目录不同,通过条件查询如何进行打包下载呢?
1.利用ZipEntry进i行文件的压缩
2.前台jsp传入需要打包下载的一系列的文件的路径(数组类型)。因为是在checkBox中,表单提交会自动将其定义成数组。只需要将name名称命名成后台需要得到的路径数组名称
比如前台
downLoadZip.jsp
--------checkBox处代码-------------------------------
利用iterator迭代出来的filePath
<input type="checkbox" name="downLoadPaths"
value='<s:property value="filePath"/>'/>
后台Action
private String[] downLoadPaths;
对downLoadPaths进行遍历,打包。。。。
代码:
/** * 批量下载(压缩成zip,然后下载)。不创建临时文件 * * @author Cloudy * */ @Namespace("xxxxxx") public class DownZipAction { /** * */ private static final long serialVersionUID = 1L; // 传递一个List<String>()对象传值路径合集 private String[] downLoadPaths; private OutputStream res; private ZipOutputStream zos; private String outPath; // Action主方法 @Action(value="DownLoadZip",results={@Result(name="nodata",location="/error.jsp"), @Result(name="success",location="xxxx.jsp")}) public String downLoadZip() throws Exception { // 有数据可以下载 if (downLoadPaths.length != 0) { // 进行预处理 preProcess(); } else { // 没有文件可以下载,返回nodata return "nodata"; } // 处理 writeZip(downLoadPaths); // 后处理关闭流 afterProcess(); return SUCCESS; } // 压缩处理 public void writeZip(String[] downLoadPaths) throws IOException { byte[] buf = new byte[8192]; int len; for (String filename : downLoadPaths) { File file = new File(filename); if (!file.isFile()) continue; ZipEntry ze = new ZipEntry(file.getName()); //apache jar的ZipEntry 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(); } } // 预处理 public void preProcess() throws Exception { HttpServletResponse response = ServletActionContext.getResponse(); res = response.getOutputStream(); // 清空输出流(在迅雷下载不会出现一长窜) response.reset(); // 设定输出文件头 response.setHeader("Content-Disposition", "attachment;filename=document.zip"); response.setContentType("application/zip"); zos = new ZipOutputStream(res); } // 后处理 public void afterProcess() throws IOException { zos.close(); res.close(); } public OutputStream getRes() { return res; } public void setRes(OutputStream res) { this.res = res; } public ZipOutputStream getZos() { return zos; } public void setZos(ZipOutputStream zos) { this.zos = zos; } public String[] getDownLoadPaths() { return downLoadPaths; } public void setDownLoadPaths(String[] downLoadPaths) { this.downLoadPaths = downLoadPaths; } public String getOutPath() { return outPath; } public void setOutPath(String outPath) { this.outPath = outPath; } }