Dateiverwaltung für die WebBox
ulrich
2017-03-14 d920b78320312112835e541012b17c54d0b843b3
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
41e9f0 19 package de.uhilger.filecms.web;
7aa566 20
U 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;
5bfd34 25 import de.uhilger.filecms.data.FileRef;
7aa566 26 import de.uhilger.filecms.web.Initialiser;
U 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());
42fece 59   
U 60   private String targetDirStr;
7aa566 61
U 62   /**
63    * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
64    * methods.
65    *
66    * @param request servlet request
67    * @param response servlet response
68    * @throws ServletException if a servlet-specific error occurs
69    * @throws IOException if an I/O error occurs
70    */
71   protected void processRequest(HttpServletRequest request, HttpServletResponse response)
72           throws ServletException, IOException {
42fece 73     
7aa566 74     //logger.log(Level.INFO, "start");
U 75     boolean isMultipart = ServletFileUpload.isMultipartContent(request);
76
77     if (isMultipart) {
78       //logger.log(Level.INFO, "isMultipart");
79       try {
80         ServletContext servletContext = this.getServletConfig().getServletContext();
81
82         // Configure a repository (to ensure a secure temp location is used)
83         File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
84         // CATALINA_BASE/work/Catalina/localhost/wbx
85
86         // Create a factory for disk-based file items
87         DiskFileItemFactory factory = newDiskFileItemFactory(servletContext, repository);
88
89         // Create a new file upload handler
90         ServletFileUpload upload = new ServletFileUpload(factory);
91
92         // Parse the request
93         List<FileItem> items = upload.parseRequest(request);
94
95         // Process the uploaded items
96         Iterator<FileItem> iter = items.iterator();
42fece 97         FileItem fileItem = null;
7aa566 98         while (iter.hasNext()) {
U 99           FileItem item = iter.next();
100
101           if (item.isFormField()) {
102             processFormField(item);
103           } else {
104             //File base = repository.getParentFile().getParentFile().getParentFile().getParentFile();
105             //File webapps = new File(base, "webapps");
106             //logger.info(webapps.getAbsolutePath());
42fece 107             fileItem = item;
7aa566 108           }
42fece 109         }
U 110         File targetDir = getTargetDir(request, targetDirStr);
111         if(targetDir != null && fileItem != null) {
112           logger.log(Level.FINER, "targetDir before upload: " + targetDir.getAbsolutePath());
113           processUploadedFile(targetDir, fileItem, true);
7aa566 114         }
U 115       } catch (Exception ex) {
116         logger.log(Level.SEVERE, null, ex);
117       }
118     } else {
119       // kein Upload
120     }
121
122     /*
123     response.setContentType("text/html;charset=UTF-8");
124     try (PrintWriter out = response.getWriter()) {
125       out.println("<!DOCTYPE html>");
126       out.println("<html>");
127       out.println("<head>");
128       out.println("<title>Servlet UploadServlet</title>");      
129       out.println("</head>");
130       out.println("<body>");
131       out.println("<h1>Servlet UploadServlet at " + request.getContextPath() + "</h1>");
132       out.println("</body>");
133       out.println("</html>");
134     }
135      */
136   }
137
138   private File getTargetDir(HttpServletRequest request, String relPath) {
42fece 139     File targetDir = null;
U 140     if(relPath != null) {
141       logger.finer(relPath);
142       String targetPath = null;
143       if(relPath.startsWith(PUB_DIR_NAME)) {
144         targetPath = PUB_DIR_PATH + getUserName(request) + relPath.substring(PUB_DIR_NAME.length());
145       } else if(relPath.startsWith(HOME_DIR_NAME)) {
146         targetPath = HOME_DIR_PATH + getUserName(request) + relPath.substring(HOME_DIR_NAME.length());
147       } else {
148         // kann eigentlich nicht sein..
149       }
150       logger.finer(targetPath);
151       targetDir = new File(getBase().getAbsolutePath(), targetPath);
7aa566 152     }
U 153     return targetDir;
154   }
155   
156   private String getUserName(HttpServletRequest request) {
157     String userName = null;
158     Object p = request.getUserPrincipal();
159     if (p instanceof Principal) {
160       userName = ((Principal) p).getName();
161     }
162     return userName;
163   }
164
165   private FileRef getBase() {
166     FileRef base = null;
167     Object o = getServletContext().getAttribute(Initialiser.FILE_BASE);
9e2964 168     if(o instanceof String) {
U 169       String baseStr = (String) o;
170       logger.fine(baseStr);
171       File file = new File(baseStr);
172       base = new FileRef(file.getAbsolutePath(), file.isDirectory());
7aa566 173     }
U 174     return base;
175   }
176
177   private void processUploadedFile(File targetDir, FileItem item, boolean writeToFile) throws Exception {
178     //logger.log(Level.INFO, "start");
179     // Process a file upload
180     if (!item.isFormField()) {
181       String fieldName = item.getFieldName();
182       String fileName = item.getName();
183       String contentType = item.getContentType();
184       boolean isInMemory = item.isInMemory();
185       long sizeInBytes = item.getSize();
186       // Process a file upload
187       if (writeToFile) {
188         File uploadedFile = new File(targetDir, fileName);
891db6 189         uploadedFile.getParentFile().mkdirs();
42fece 190         logger.log(Level.FINER, "writeToFile " + uploadedFile.getAbsolutePath());
7aa566 191         item.write(uploadedFile);
U 192       } else {
193         InputStream uploadedStream = item.getInputStream();
194         //...
195         uploadedStream.close();
196       }
197     }
198   }
199
200   private void processFormField(FileItem item) {
201     //logger.log(Level.INFO, "start");
202     // Process a regular form field
203     if (item.isFormField()) {
204       String name = item.getFieldName();
205       String value = item.getString();
42fece 206       logger.log(Level.FINER, "field name: " + name + ", value: " + value);
7aa566 207       //...
42fece 208       if(name.equals("pfad")) {
U 209         targetDirStr = value;
210       }
7aa566 211     }
U 212   }
213
214   public static DiskFileItemFactory newDiskFileItemFactory(ServletContext context,
215           File repository) {
216     FileCleaningTracker fileCleaningTracker
217             = FileCleanerCleanup.getFileCleaningTracker(context);
218     DiskFileItemFactory factory
219             = new DiskFileItemFactory(DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD,
220                     repository);
221     factory.setFileCleaningTracker(fileCleaningTracker);
222     return factory;
223   }
224
225   // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
226   /**
227    * Handles the HTTP <code>GET</code> method.
228    *
229    * @param request servlet request
230    * @param response servlet response
231    * @throws ServletException if a servlet-specific error occurs
232    * @throws IOException if an I/O error occurs
233    */
234   @Override
235   protected void doGet(HttpServletRequest request, HttpServletResponse response)
236           throws ServletException, IOException {
237     processRequest(request, response);
238   }
239
240   /**
241    * Handles the HTTP <code>POST</code> method.
242    *
243    * @param request servlet request
244    * @param response servlet response
245    * @throws ServletException if a servlet-specific error occurs
246    * @throws IOException if an I/O error occurs
247    */
248   @Override
249   protected void doPost(HttpServletRequest request, HttpServletResponse response)
250           throws ServletException, IOException {
251     processRequest(request, response);
252   }
253
254   /**
255    * Returns a short description of the servlet.
256    *
257    * @return a String containing servlet description
258    */
259   @Override
260   public String getServletInfo() {
261     return DESC;
262   }// </editor-fold>
263
264 }