1.在action中定义变量
1 2 3 4 5 6 | 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. 主方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | /** * 下载多个文件:压缩成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中配置
1 2 3 4 5 6 | <action name= "downLoadBkPersonLessionsZip" class = "bkPersonLessionAction" method= "downLoadLessionsZip" > //class值为bean.xml中配置的bean <result name= "nodata" type= "httpheader" > <param name= "status" > 204 </param> //表示响应执行成功,但没有数据返回,浏览器不用刷新,不用导向新页面 </result> </action> |
DEMO下载地址:https://dwz.cn/Jw3z6fVq