Dateiverwaltung für die WebBox
ulrich
2017-03-06 fab80c872af697d61f200fd410a7ecc64ca0a537
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;
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);
42fece 189         logger.log(Level.FINER, "writeToFile " + uploadedFile.getAbsolutePath());
7aa566 190         item.write(uploadedFile);
U 191       } else {
192         InputStream uploadedStream = item.getInputStream();
193         //...
194         uploadedStream.close();
195       }
196     }
197   }
198
199   private void processFormField(FileItem item) {
200     //logger.log(Level.INFO, "start");
201     // Process a regular form field
202     if (item.isFormField()) {
203       String name = item.getFieldName();
204       String value = item.getString();
42fece 205       logger.log(Level.FINER, "field name: " + name + ", value: " + value);
7aa566 206       //...
42fece 207       if(name.equals("pfad")) {
U 208         targetDirStr = value;
209       }
7aa566 210     }
U 211   }
212
213   public static DiskFileItemFactory newDiskFileItemFactory(ServletContext context,
214           File repository) {
215     FileCleaningTracker fileCleaningTracker
216             = FileCleanerCleanup.getFileCleaningTracker(context);
217     DiskFileItemFactory factory
218             = new DiskFileItemFactory(DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD,
219                     repository);
220     factory.setFileCleaningTracker(fileCleaningTracker);
221     return factory;
222   }
223
224   // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
225   /**
226    * Handles the HTTP <code>GET</code> method.
227    *
228    * @param request servlet request
229    * @param response servlet response
230    * @throws ServletException if a servlet-specific error occurs
231    * @throws IOException if an I/O error occurs
232    */
233   @Override
234   protected void doGet(HttpServletRequest request, HttpServletResponse response)
235           throws ServletException, IOException {
236     processRequest(request, response);
237   }
238
239   /**
240    * Handles the HTTP <code>POST</code> method.
241    *
242    * @param request servlet request
243    * @param response servlet response
244    * @throws ServletException if a servlet-specific error occurs
245    * @throws IOException if an I/O error occurs
246    */
247   @Override
248   protected void doPost(HttpServletRequest request, HttpServletResponse response)
249           throws ServletException, IOException {
250     processRequest(request, response);
251   }
252
253   /**
254    * Returns a short description of the servlet.
255    *
256    * @return a String containing servlet description
257    */
258   @Override
259   public String getServletInfo() {
260     return DESC;
261   }// </editor-fold>
262
263 }