1 25 26 package net.killingar.actions; 27 28 import net.killingar.servlet.FileZipOutputStream; 29 30 import java.io.File ; 31 import java.io.IOException ; 32 33 public class DownloadZip extends PathActionSupport 34 { 35 37 boolean recursive; 39 40 public boolean getRecursive() { return recursive; } 42 43 public void setRecursive(boolean in) { recursive = in; } 45 46 public String doExecute() 48 { 49 javax.servlet.http.HttpServletResponse response = webwork.action.ServletActionContext.getResponse(); 50 try 51 { 52 javax.servlet.http.HttpServletRequest req = webwork.action.ServletActionContext.getRequest(); 53 54 response.setContentType("application/x-zip-compressed"); 55 response.setHeader("Content-Disposition", "attachment; filename="+(path.substring(path.lastIndexOf('/')+1)+".zip").replaceAll(" ", "_")); 56 57 FileZipOutputStream out = new FileZipOutputStream(response.getOutputStream()); 58 59 traverse(req, path, out, recursive, 0); 60 61 out.finish(); 62 response.flushBuffer(); 63 response.getOutputStream().flush(); 64 response.getOutputStream().close(); 65 } 66 catch (Exception e) 67 { 68 addErrorMessage("download failed, exception thrown ("+e.toString()+")"); 69 e.printStackTrace(); 70 71 response.setContentType("text/html"); 72 73 return ERROR; 74 } 75 76 return NONE; 77 } 78 79 public static void traverse(javax.servlet.http.HttpServletRequest req, String path, FileZipOutputStream out, boolean recursive, int step) throws IOException 80 { 81 String test = path.substring(path.lastIndexOf('/')+1); 82 if (".svn".equals(test) || "WEB-INF".equals(test)) 83 return; 84 85 File f = new File (req.getRealPath(path)); 86 if (!f.exists()) 87 { 88 throw new IOException ("file not found (path: "+path+" real: "+req.getRealPath(path)+")"); 89 } 90 91 if (f.isDirectory()) 92 { 93 if (!recursive && step > 0)return; 94 95 File files[] = f.listFiles(); 96 String subPath = path; 97 if (subPath.length() != 0 && subPath.charAt(subPath.length()-1) != '/') 98 subPath += "/"; 99 100 for (int i = 0; i < files.length; i++) 101 { 102 traverse(req, subPath+files[i].getName(), out, recursive, step+1); 103 } 104 } 105 else 106 { 107 out.putFile(f, path.length() > 0 && path.charAt(0) == '/'? path.substring(1) : path); 108 } 109 } 110 } 111 | Popular Tags |