KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > net > killingar > actions > DownloadZip


1 /* Copyright 2000-2005 Anders Hovmöller
2  *
3  * The person or persons who have associated their work with
4  * this document (the "Dedicator") hereby dedicate the entire
5  * copyright in the work of authorship identified below (the
6  * "Work") to the public domain.
7  *
8  * Dedicator makes this dedication for the benefit of the
9  * public at large and to the detriment of Dedicator's heirs
10  * and successors. Dedicator intends this dedication to be an
11  * overt act of relinquishment in perpetuity of all present
12  * and future rights under copyright law, whether vested or
13  * contingent, in the Work. Dedicator understands that such
14  * relinquishment of all rights includes the relinquishment of
15  * all rights to enforce (by lawsuit or otherwise) those
16  * copyrights in the Work.
17  *
18  * Dedicator recognizes that, once placed in the public
19  * domain, the Work may be freely reproduced, distributed,
20  * transmitted, used, modified, built upon, or otherwise
21  * exploited by anyone for any purpose, commercial or non-
22  * commercial, and in any way, including by methods that have
23  * not yet been invented or conceived.
24  */

25
26 package net.killingar.actions;
27
28 import net.killingar.servlet.FileZipOutputStream;
29
30 import java.io.File JavaDoc;
31 import java.io.IOException JavaDoc;
32
33 public class DownloadZip extends PathActionSupport
34 {
35     // Types ---------------------------------------------------------
36

37     // Attributes ----------------------------------------------------
38
boolean recursive;
39
40     // getters
41
public boolean getRecursive() { return recursive; }
42
43     // setters
44
public void setRecursive(boolean in) { recursive = in; }
45
46     // Implementation
47
public String JavaDoc doExecute()
48     {
49         javax.servlet.http.HttpServletResponse JavaDoc response = webwork.action.ServletActionContext.getResponse();
50         try
51         {
52             javax.servlet.http.HttpServletRequest JavaDoc 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 JavaDoc 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 JavaDoc req, String JavaDoc path, FileZipOutputStream out, boolean recursive, int step) throws IOException JavaDoc
80     {
81         String JavaDoc test = path.substring(path.lastIndexOf('/')+1);
82         if (".svn".equals(test) || "WEB-INF".equals(test))
83             return;
84
85         File JavaDoc f = new File JavaDoc(req.getRealPath(path));
86         if (!f.exists())
87         {
88             throw new IOException JavaDoc("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 JavaDoc files[] = f.listFiles();
96             String JavaDoc 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