Dateiverwaltung für die WebBox
ulrich
2017-02-27 42fecef285c712f2a8d9b1b6371edc6ea9d9fac6
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;
42fece 31 import java.util.Enumeration;
7aa566 32 import java.util.Iterator;
U 33 import java.util.List;
34 import java.util.logging.Level;
35 import java.util.logging.Logger;
36 import javax.servlet.ServletContext;
37 import javax.servlet.ServletException;
38 import javax.servlet.http.HttpServlet;
39 import javax.servlet.http.HttpServletRequest;
40 import javax.servlet.http.HttpServletResponse;
41 import org.apache.commons.fileupload.FileItem;
42 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
43 import org.apache.commons.fileupload.servlet.FileCleanerCleanup;
44 import org.apache.commons.fileupload.servlet.ServletFileUpload;
45 import org.apache.commons.io.FileCleaningTracker;
46
47 /**
48  * Objekte der Klasee UploadServlet nehmen eine Datei per HTTP Multipart Request
49  * entgegen und speichern sie im webapps-Verzeichnis des Servlet-Containers.
50  *
51  * Annahme ist, dass das von javax.servlet.context.tempdir bezeichnete
52  * Verzeichnis auf CATALINA_BASE/work/Catalina/localhost/[context] zeigt. Von
53  * dort wird dann das webapps-Verzeichnis als CATALINA_BASE/webapps ermittelt.
54  */
55 public class UploadServlet extends HttpServlet {
56
57   public static final String DESC = "file-cms uploader";
58
59   private static final Logger logger = Logger.getLogger(UploadServlet.class.getName());
42fece 60   
U 61   private String targetDirStr;
7aa566 62
U 63   /**
64    * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
65    * methods.
66    *
67    * @param request servlet request
68    * @param response servlet response
69    * @throws ServletException if a servlet-specific error occurs
70    * @throws IOException if an I/O error occurs
71    */
72   protected void processRequest(HttpServletRequest request, HttpServletResponse response)
73           throws ServletException, IOException {
42fece 74     
7aa566 75     //logger.log(Level.INFO, "start");
U 76     boolean isMultipart = ServletFileUpload.isMultipartContent(request);
77
78     if (isMultipart) {
79       //logger.log(Level.INFO, "isMultipart");
80       try {
81         ServletContext servletContext = this.getServletConfig().getServletContext();
82
83         // Configure a repository (to ensure a secure temp location is used)
84         File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
85         // CATALINA_BASE/work/Catalina/localhost/wbx
86
87         // Create a factory for disk-based file items
88         DiskFileItemFactory factory = newDiskFileItemFactory(servletContext, repository);
89
90         // Create a new file upload handler
91         ServletFileUpload upload = new ServletFileUpload(factory);
92
93         // Parse the request
94         List<FileItem> items = upload.parseRequest(request);
95
96         // Process the uploaded items
97         Iterator<FileItem> iter = items.iterator();
42fece 98         FileItem fileItem = null;
7aa566 99         while (iter.hasNext()) {
U 100           FileItem item = iter.next();
101
102           if (item.isFormField()) {
103             processFormField(item);
104           } else {
105             //File base = repository.getParentFile().getParentFile().getParentFile().getParentFile();
106             //File webapps = new File(base, "webapps");
107             //logger.info(webapps.getAbsolutePath());
42fece 108             fileItem = item;
7aa566 109           }
42fece 110         }
U 111         File targetDir = getTargetDir(request, targetDirStr);
112         if(targetDir != null && fileItem != null) {
113           logger.log(Level.FINER, "targetDir before upload: " + targetDir.getAbsolutePath());
114           processUploadedFile(targetDir, fileItem, true);
7aa566 115         }
U 116       } catch (Exception ex) {
117         logger.log(Level.SEVERE, null, ex);
118       }
119     } else {
120       // kein Upload
121     }
122
123     /*
124     response.setContentType("text/html;charset=UTF-8");
125     try (PrintWriter out = response.getWriter()) {
126       out.println("<!DOCTYPE html>");
127       out.println("<html>");
128       out.println("<head>");
129       out.println("<title>Servlet UploadServlet</title>");      
130       out.println("</head>");
131       out.println("<body>");
132       out.println("<h1>Servlet UploadServlet at " + request.getContextPath() + "</h1>");
133       out.println("</body>");
134       out.println("</html>");
135     }
136      */
137   }
138
139   private File getTargetDir(HttpServletRequest request, String relPath) {
42fece 140     File targetDir = null;
U 141     if(relPath != null) {
142       logger.finer(relPath);
143       String targetPath = null;
144       if(relPath.startsWith(PUB_DIR_NAME)) {
145         targetPath = PUB_DIR_PATH + getUserName(request) + relPath.substring(PUB_DIR_NAME.length());
146       } else if(relPath.startsWith(HOME_DIR_NAME)) {
147         targetPath = HOME_DIR_PATH + getUserName(request) + relPath.substring(HOME_DIR_NAME.length());
148       } else {
149         // kann eigentlich nicht sein..
150       }
151       logger.finer(targetPath);
152       targetDir = new File(getBase().getAbsolutePath(), targetPath);
7aa566 153     }
U 154     return targetDir;
155   }
156   
157   private String getUserName(HttpServletRequest request) {
158     String userName = null;
159     Object p = request.getUserPrincipal();
160     if (p instanceof Principal) {
161       userName = ((Principal) p).getName();
162     }
163     return userName;
164   }
165
166   private FileRef getBase() {
167     FileRef base = null;
168     Object o = getServletContext().getAttribute(Initialiser.FILE_BASE);
169     if (o instanceof FileRef) {
170       base = (FileRef) o;
171     }
172     return base;
173   }
174
175   private void processUploadedFile(File targetDir, FileItem item, boolean writeToFile) throws Exception {
176     //logger.log(Level.INFO, "start");
177     // Process a file upload
178     if (!item.isFormField()) {
179       String fieldName = item.getFieldName();
180       String fileName = item.getName();
181       String contentType = item.getContentType();
182       boolean isInMemory = item.isInMemory();
183       long sizeInBytes = item.getSize();
184       // Process a file upload
185       if (writeToFile) {
186         File uploadedFile = new File(targetDir, fileName);
42fece 187         logger.log(Level.FINER, "writeToFile " + uploadedFile.getAbsolutePath());
7aa566 188         item.write(uploadedFile);
U 189       } else {
190         InputStream uploadedStream = item.getInputStream();
191         //...
192         uploadedStream.close();
193       }
194     }
195   }
196
197   private void processFormField(FileItem item) {
198     //logger.log(Level.INFO, "start");
199     // Process a regular form field
200     if (item.isFormField()) {
201       String name = item.getFieldName();
202       String value = item.getString();
42fece 203       logger.log(Level.FINER, "field name: " + name + ", value: " + value);
7aa566 204       //...
42fece 205       if(name.equals("pfad")) {
U 206         targetDirStr = value;
207       }
7aa566 208     }
U 209   }
210
211   public static DiskFileItemFactory newDiskFileItemFactory(ServletContext context,
212           File repository) {
213     FileCleaningTracker fileCleaningTracker
214             = FileCleanerCleanup.getFileCleaningTracker(context);
215     DiskFileItemFactory factory
216             = new DiskFileItemFactory(DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD,
217                     repository);
218     factory.setFileCleaningTracker(fileCleaningTracker);
219     return factory;
220   }
221
222   // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
223   /**
224    * Handles the HTTP <code>GET</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 doGet(HttpServletRequest request, HttpServletResponse response)
233           throws ServletException, IOException {
234     processRequest(request, response);
235   }
236
237   /**
238    * Handles the HTTP <code>POST</code> method.
239    *
240    * @param request servlet request
241    * @param response servlet response
242    * @throws ServletException if a servlet-specific error occurs
243    * @throws IOException if an I/O error occurs
244    */
245   @Override
246   protected void doPost(HttpServletRequest request, HttpServletResponse response)
247           throws ServletException, IOException {
248     processRequest(request, response);
249   }
250
251   /**
252    * Returns a short description of the servlet.
253    *
254    * @return a String containing servlet description
255    */
256   @Override
257   public String getServletInfo() {
258     return DESC;
259   }// </editor-fold>
260
261 }