使用ant.jar包的API进行文件夹打包。直接上代码:
1 String zipfilename = "test.zip"; 2 File zipfile = new File(zipfilename); 3 org.apache.tools.ant.types.FileSet fileSet = new FileSet(); 4 org.apache.tools.ant.Project prj = new Project(); 5 org.apache.tools.ant.taskdefs.Zip zip = new Zip(); 6 zip.setProject(prj); 7 zip.setDestFile(zipfile); 8 fileSet.setProject(prj); 9 fileSet.setDir(file); // 这里是文件路径的设置。 10 zip.addFileset(fileSet); 11 zip.execute(); 12 HttpServletResponse response = super.currentResponse; 13 response.setHeader("Content-Type", "application/zip"); 14 response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(zipfilename, "UTF-8")); 15 OutputStream os = response.getOutputStream(); 16 InputStream is = new FileInputStream(zipfile); 17 DownloadUtil.transfer(is, os); 18 zipfile.delete();
如果在下载的时候,不希望下载文件路径下的所有文件,而是部分符合自己需求的文件的话。
下面这个例子,除了check了需求之外,还远端的文件进行了操作,利用ChannelSftp取得的连接,进行文件读入并下载。
如下:
private com.jcraft.jsch.ChannelSftp channel; // 这行是类成员变量
1 String zipfilename = getServerZipFileName(inputfilename); 2 3 if (channel == null || !channel.isConnected()) { 4 channel = SftpUtils.connect(sftpHost, Integer.parseInt(sftpPort), sftpUsername, sftpPassword);// 取得连接。 5 } 6 7 HttpServletResponse response = super.currentResponse; 8 9 try { 10 boolean isMultiFilesName = isMultiFilesName(inputfilename); 11 Vector <com.jcraft.jsch.ChannelSftp.LsEntry> vs = channel.ls(logfilepath); 12 if (vs.isEmpty()) { 13 return false; 14 } else { 15 response.setHeader("Content-Type", "application/octet-stream"); 16 response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(zipfilename, "UTF-8")); 17 OutputStream out = response.getOutputStream(); 18 java.util.zip.ZipOutputStream zipOut = new ZipOutputStream(new BufferedOutputStream(out)); 19 for (LsEntry entry : vs) { 20 if (entry.getAttrs().toString().startsWith("-")) { 21 String entryname = entry.getFilename(); 22 if (isMultiFilesName && entryname.startsWith(inputfilename.substring(0, inputfilename.length() - 1)) 23 && !entryname.matches("^.*[\*]+.*$") || entryname.equals(inputfilename)) { // 符合规则的文件才做输出处理 24 java.util.zip.ZipEntry zipentry = new ZipEntry(entryname); 25 zipOut.putNextEntry(zipentry); 26 InputStream bis = channel.get(logfilepath + entryname); // 这里要注意,目标目录下的文件名称,不能有*,不然这一步get方法的目标可能是多个文件而出错。 27 if (bis != null) { 28 int count = 0; 29 byte[] buffer = new byte[8192]; 30 while ((count = bis.read(buffer)) > 0) { 31 zipOut.write(buffer, 0, count); 32 } 33 bis.close(); 34 } 35 } 36 } 37 } 38 zipOut.close(); 39 } 40 } catch (Exception e) { 41 response.reset(); 42 e.printStackTrace(); 43 return false; 44 } finally { 45 if (channel != null && !channel.isClosed()) { 46 channel.getSession().disconnect(); 47 channel.disconnect(); 48 } 49 }