Dateiverwaltung für die WebBox
ulrich
2017-02-25 723bf71779b1a272e85fc477207ae31648837981
commit | author | age
723bf7 1 /*
U 2     Dateiverwaltung - File management in your browser
3     Copyright (C) 2017 Ulrich Hilger, http://uhilger.de
4
5     This program is free software: you can redistribute it and/or modify
6     it under the terms of the GNU Affero General Public License as
7     published by the Free Software Foundation, either version 3 of the
8     License, or (at your option) any later version.
9
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU Affero General Public License for more details.
14
15     You should have received a copy of the GNU Affero General Public License
16     along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 */
18
7aa566 19 package de.uhilger.filecms.api;
U 20
21 import static de.uhilger.filecms.api.FileMgr.HOME_DIR_NAME;
22 import static de.uhilger.filecms.api.FileMgr.HOME_DIR_PATH;
23 import static de.uhilger.filecms.api.FileMgr.PUB_DIR_NAME;
24 import static de.uhilger.filecms.api.FileMgr.PUB_DIR_PATH;
25 import de.uhilger.filecms.web.Initialiser;
26 import de.uhilger.filesystem.FileRef;
27 import java.io.File;
28 import java.io.IOException;
29 import java.io.InputStream;
30 import java.security.Principal;
31 import java.util.Iterator;
32 import java.util.List;
33 import java.util.logging.Level;
34 import java.util.logging.Logger;
35 import javax.servlet.ServletContext;
36 import javax.servlet.ServletException;
37 import javax.servlet.http.HttpServlet;
38 import javax.servlet.http.HttpServletRequest;
39 import javax.servlet.http.HttpServletResponse;
40 import org.apache.commons.fileupload.FileItem;
41 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
42 import org.apache.commons.fileupload.servlet.FileCleanerCleanup;
43 import org.apache.commons.fileupload.servlet.ServletFileUpload;
44 import org.apache.commons.io.FileCleaningTracker;
45
46 /**
47  * Objekte der Klasee UploadServlet nehmen eine Datei per HTTP Multipart Request
48  * entgegen und speichern sie im webapps-Verzeichnis des Servlet-Containers.
49  *
50  * Annahme ist, dass das von javax.servlet.context.tempdir bezeichnete
51  * Verzeichnis auf CATALINA_BASE/work/Catalina/localhost/[context] zeigt. Von
52  * dort wird dann das webapps-Verzeichnis als CATALINA_BASE/webapps ermittelt.
53  */
54 public class UploadServlet extends HttpServlet {
55
56   public static final String DESC = "file-cms uploader";
57
58   private static final Logger logger = Logger.getLogger(UploadServlet.class.getName());
59
60   /**
61    * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
62    * methods.
63    *
64    * @param request servlet request
65    * @param response servlet response
66    * @throws ServletException if a servlet-specific error occurs
67    * @throws IOException if an I/O error occurs
68    */
69   protected void processRequest(HttpServletRequest request, HttpServletResponse response)
70           throws ServletException, IOException {
71     //logger.log(Level.INFO, "start");
72     boolean isMultipart = ServletFileUpload.isMultipartContent(request);
73
74     if (isMultipart) {
75       //logger.log(Level.INFO, "isMultipart");
76       try {
77         ServletContext servletContext = this.getServletConfig().getServletContext();
78
79         // Configure a repository (to ensure a secure temp location is used)
80         File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
81         // CATALINA_BASE/work/Catalina/localhost/wbx
82
83         // Create a factory for disk-based file items
84         DiskFileItemFactory factory = newDiskFileItemFactory(servletContext, repository);
85
86         // Create a new file upload handler
87         ServletFileUpload upload = new ServletFileUpload(factory);
88
89         // Parse the request
90         List<FileItem> items = upload.parseRequest(request);
91
92         // Process the uploaded items
93         Iterator<FileItem> iter = items.iterator();
94         while (iter.hasNext()) {
95           FileItem item = iter.next();
96
97           if (item.isFormField()) {
98             processFormField(item);
99           } else {
100             //File base = repository.getParentFile().getParentFile().getParentFile().getParentFile();
101             //File webapps = new File(base, "webapps");
102             //logger.info(webapps.getAbsolutePath());
103             File targetDir = getTargetDir(request, PUB_DIR_NAME);
104             logger.log(Level.FINE, "rufe processUploadedFile");
105             processUploadedFile(targetDir, item, true);
106           }
107         }
108       } catch (Exception ex) {
109         logger.log(Level.SEVERE, null, ex);
110       }
111     } else {
112       // kein Upload
113     }
114
115     /*
116     response.setContentType("text/html;charset=UTF-8");
117     try (PrintWriter out = response.getWriter()) {
118       out.println("<!DOCTYPE html>");
119       out.println("<html>");
120       out.println("<head>");
121       out.println("<title>Servlet UploadServlet</title>");      
122       out.println("</head>");
123       out.println("<body>");
124       out.println("<h1>Servlet UploadServlet at " + request.getContextPath() + "</h1>");
125       out.println("</body>");
126       out.println("</html>");
127     }
128      */
129   }
130
131   private File getTargetDir(HttpServletRequest request, String relPath) {
132     logger.finer(relPath);
133     String targetPath = null;
134     if(relPath.startsWith(PUB_DIR_NAME)) {
135       targetPath = PUB_DIR_PATH + getUserName(request) + "/" + relPath.substring(PUB_DIR_NAME.length());
136     } else if(relPath.startsWith(HOME_DIR_NAME)) {
137       targetPath = HOME_DIR_PATH + getUserName(request) + "/" + relPath.substring(HOME_DIR_NAME.length());
138     } else {
139       // kann eigentlich nicht sein..
140     }
141     logger.finer(targetPath);
142     File targetDir = new File(getBase().getAbsolutePath(), targetPath);
143     return targetDir;
144   }
145   
146   private String getUserName(HttpServletRequest request) {
147     String userName = null;
148     Object p = request.getUserPrincipal();
149     if (p instanceof Principal) {
150       userName = ((Principal) p).getName();
151     }
152     return userName;
153   }
154
155   private FileRef getBase() {
156     FileRef base = null;
157     Object o = getServletContext().getAttribute(Initialiser.FILE_BASE);
158     if (o instanceof FileRef) {
159       base = (FileRef) o;
160     }
161     return base;
162   }
163
164   private void processUploadedFile(File targetDir, FileItem item, boolean writeToFile) throws Exception {
165     //logger.log(Level.INFO, "start");
166     // Process a file upload
167     if (!item.isFormField()) {
168       String fieldName = item.getFieldName();
169       String fileName = item.getName();
170       String contentType = item.getContentType();
171       boolean isInMemory = item.isInMemory();
172       long sizeInBytes = item.getSize();
173       // Process a file upload
174       if (writeToFile) {
175         //logger.log(Level.INFO, "writeToFile " + fileName);
176         File uploadedFile = new File(targetDir, fileName);
177         item.write(uploadedFile);
178       } else {
179         InputStream uploadedStream = item.getInputStream();
180         //...
181         uploadedStream.close();
182       }
183     }
184   }
185
186   private void processFormField(FileItem item) {
187     //logger.log(Level.INFO, "start");
188     // Process a regular form field
189     if (item.isFormField()) {
190       String name = item.getFieldName();
191       String value = item.getString();
192       //logger.log(Level.INFO, "field name: " + name + ", value: " + value);
193       //...
194     }
195   }
196
197   public static DiskFileItemFactory newDiskFileItemFactory(ServletContext context,
198           File repository) {
199     FileCleaningTracker fileCleaningTracker
200             = FileCleanerCleanup.getFileCleaningTracker(context);
201     DiskFileItemFactory factory
202             = new DiskFileItemFactory(DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD,
203                     repository);
204     factory.setFileCleaningTracker(fileCleaningTracker);
205     return factory;
206   }
207
208   // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
209   /**
210    * Handles the HTTP <code>GET</code> method.
211    *
212    * @param request servlet request
213    * @param response servlet response
214    * @throws ServletException if a servlet-specific error occurs
215    * @throws IOException if an I/O error occurs
216    */
217   @Override
218   protected void doGet(HttpServletRequest request, HttpServletResponse response)
219           throws ServletException, IOException {
220     processRequest(request, response);
221   }
222
223   /**
224    * Handles the HTTP <code>POST</code> method.
225    *
226    * @param request servlet request
227    * @param response servlet response
228    * @throws ServletException if a servlet-specific error occurs
229    * @throws IOException if an I/O error occurs
230    */
231   @Override
232   protected void doPost(HttpServletRequest request, HttpServletResponse response)
233           throws ServletException, IOException {
234     processRequest(request, response);
235   }
236
237   /**
238    * Returns a short description of the servlet.
239    *
240    * @return a String containing servlet description
241    */
242   @Override
243   public String getServletInfo() {
244     return DESC;
245   }// </editor-fold>
246
247 }