From 7aa5665ab6b2bb72582713eda9534a02f7b3c50a Mon Sep 17 00:00:00 2001 From: Ulrich <undisclosed> Date: Thu, 23 Feb 2017 16:50:10 +0000 Subject: [PATCH] erste Rohfassung der Upload-Funktion laeuft --- web/WEB-INF/web.xml | 8 + src/java/de/uhilger/filecms/api/UploadServlet.java | 229 ++++++++++++++++++++++++++++++++++++++ web/ui/index.html | 5 web/ui/ui.js | 91 +++++++++++++++ 4 files changed, 328 insertions(+), 5 deletions(-) diff --git a/src/java/de/uhilger/filecms/api/UploadServlet.java b/src/java/de/uhilger/filecms/api/UploadServlet.java new file mode 100644 index 0000000..deed276 --- /dev/null +++ b/src/java/de/uhilger/filecms/api/UploadServlet.java @@ -0,0 +1,229 @@ +package de.uhilger.filecms.api; + +import static de.uhilger.filecms.api.FileMgr.HOME_DIR_NAME; +import static de.uhilger.filecms.api.FileMgr.HOME_DIR_PATH; +import static de.uhilger.filecms.api.FileMgr.PUB_DIR_NAME; +import static de.uhilger.filecms.api.FileMgr.PUB_DIR_PATH; +import de.uhilger.filecms.web.Initialiser; +import de.uhilger.filesystem.FileRef; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.security.Principal; +import java.util.Iterator; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.commons.fileupload.servlet.FileCleanerCleanup; +import org.apache.commons.fileupload.servlet.ServletFileUpload; +import org.apache.commons.io.FileCleaningTracker; + +/** + * Objekte der Klasee UploadServlet nehmen eine Datei per HTTP Multipart Request + * entgegen und speichern sie im webapps-Verzeichnis des Servlet-Containers. + * + * Annahme ist, dass das von javax.servlet.context.tempdir bezeichnete + * Verzeichnis auf CATALINA_BASE/work/Catalina/localhost/[context] zeigt. Von + * dort wird dann das webapps-Verzeichnis als CATALINA_BASE/webapps ermittelt. + */ +public class UploadServlet extends HttpServlet { + + public static final String DESC = "file-cms uploader"; + + private static final Logger logger = Logger.getLogger(UploadServlet.class.getName()); + + /** + * Processes requests for both HTTP <code>GET</code> and <code>POST</code> + * methods. + * + * @param request servlet request + * @param response servlet response + * @throws ServletException if a servlet-specific error occurs + * @throws IOException if an I/O error occurs + */ + protected void processRequest(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + //logger.log(Level.INFO, "start"); + boolean isMultipart = ServletFileUpload.isMultipartContent(request); + + if (isMultipart) { + //logger.log(Level.INFO, "isMultipart"); + try { + ServletContext servletContext = this.getServletConfig().getServletContext(); + + // Configure a repository (to ensure a secure temp location is used) + File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir"); + // CATALINA_BASE/work/Catalina/localhost/wbx + + // Create a factory for disk-based file items + DiskFileItemFactory factory = newDiskFileItemFactory(servletContext, repository); + + // Create a new file upload handler + ServletFileUpload upload = new ServletFileUpload(factory); + + // Parse the request + List<FileItem> items = upload.parseRequest(request); + + // Process the uploaded items + Iterator<FileItem> iter = items.iterator(); + while (iter.hasNext()) { + FileItem item = iter.next(); + + if (item.isFormField()) { + processFormField(item); + } else { + //File base = repository.getParentFile().getParentFile().getParentFile().getParentFile(); + //File webapps = new File(base, "webapps"); + //logger.info(webapps.getAbsolutePath()); + File targetDir = getTargetDir(request, PUB_DIR_NAME); + logger.log(Level.FINE, "rufe processUploadedFile"); + processUploadedFile(targetDir, item, true); + } + } + } catch (Exception ex) { + logger.log(Level.SEVERE, null, ex); + } + } else { + // kein Upload + } + + /* + response.setContentType("text/html;charset=UTF-8"); + try (PrintWriter out = response.getWriter()) { + out.println("<!DOCTYPE html>"); + out.println("<html>"); + out.println("<head>"); + out.println("<title>Servlet UploadServlet</title>"); + out.println("</head>"); + out.println("<body>"); + out.println("<h1>Servlet UploadServlet at " + request.getContextPath() + "</h1>"); + out.println("</body>"); + out.println("</html>"); + } + */ + } + + private File getTargetDir(HttpServletRequest request, String relPath) { + logger.finer(relPath); + String targetPath = null; + if(relPath.startsWith(PUB_DIR_NAME)) { + targetPath = PUB_DIR_PATH + getUserName(request) + "/" + relPath.substring(PUB_DIR_NAME.length()); + } else if(relPath.startsWith(HOME_DIR_NAME)) { + targetPath = HOME_DIR_PATH + getUserName(request) + "/" + relPath.substring(HOME_DIR_NAME.length()); + } else { + // kann eigentlich nicht sein.. + } + logger.finer(targetPath); + File targetDir = new File(getBase().getAbsolutePath(), targetPath); + return targetDir; + } + + private String getUserName(HttpServletRequest request) { + String userName = null; + Object p = request.getUserPrincipal(); + if (p instanceof Principal) { + userName = ((Principal) p).getName(); + } + return userName; + } + + private FileRef getBase() { + FileRef base = null; + Object o = getServletContext().getAttribute(Initialiser.FILE_BASE); + if (o instanceof FileRef) { + base = (FileRef) o; + } + return base; + } + + private void processUploadedFile(File targetDir, FileItem item, boolean writeToFile) throws Exception { + //logger.log(Level.INFO, "start"); + // Process a file upload + if (!item.isFormField()) { + String fieldName = item.getFieldName(); + String fileName = item.getName(); + String contentType = item.getContentType(); + boolean isInMemory = item.isInMemory(); + long sizeInBytes = item.getSize(); + // Process a file upload + if (writeToFile) { + //logger.log(Level.INFO, "writeToFile " + fileName); + File uploadedFile = new File(targetDir, fileName); + item.write(uploadedFile); + } else { + InputStream uploadedStream = item.getInputStream(); + //... + uploadedStream.close(); + } + } + } + + private void processFormField(FileItem item) { + //logger.log(Level.INFO, "start"); + // Process a regular form field + if (item.isFormField()) { + String name = item.getFieldName(); + String value = item.getString(); + //logger.log(Level.INFO, "field name: " + name + ", value: " + value); + //... + } + } + + public static DiskFileItemFactory newDiskFileItemFactory(ServletContext context, + File repository) { + FileCleaningTracker fileCleaningTracker + = FileCleanerCleanup.getFileCleaningTracker(context); + DiskFileItemFactory factory + = new DiskFileItemFactory(DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD, + repository); + factory.setFileCleaningTracker(fileCleaningTracker); + return factory; + } + + // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code."> + /** + * Handles the HTTP <code>GET</code> method. + * + * @param request servlet request + * @param response servlet response + * @throws ServletException if a servlet-specific error occurs + * @throws IOException if an I/O error occurs + */ + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + processRequest(request, response); + } + + /** + * Handles the HTTP <code>POST</code> method. + * + * @param request servlet request + * @param response servlet response + * @throws ServletException if a servlet-specific error occurs + * @throws IOException if an I/O error occurs + */ + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + processRequest(request, response); + } + + /** + * Returns a short description of the servlet. + * + * @return a String containing servlet description + */ + @Override + public String getServletInfo() { + return DESC; + }// </editor-fold> + +} diff --git a/web/WEB-INF/web.xml b/web/WEB-INF/web.xml index d3d1747..1703185 100644 --- a/web/WEB-INF/web.xml +++ b/web/WEB-INF/web.xml @@ -34,6 +34,10 @@ <param-value>de.uhilger.filecms.pub</param-value> </init-param> </servlet> + <servlet> + <servlet-name>UploadeServlet</servlet-name> + <servlet-class>de.uhilger.filecms.api.UploadServlet</servlet-class> + </servlet> <servlet-mapping> <servlet-name>TransitRS</servlet-name> <url-pattern>/rpc/*</url-pattern> @@ -46,6 +50,10 @@ <servlet-name>PublicTransit</servlet-name> <url-pattern>/pub</url-pattern> </servlet-mapping> + <servlet-mapping> + <servlet-name>UploadeServlet</servlet-name> + <url-pattern>/api/upload</url-pattern> + </servlet-mapping> <session-config> <session-timeout> 30 diff --git a/web/ui/index.html b/web/ui/index.html index 47a78af..28455a6 100644 --- a/web/ui/index.html +++ b/web/ui/index.html @@ -131,10 +131,7 @@ </div> <!-- oestliche Seitenleiste --> - - <div class="ost"> - östliche Seitenleiste - </div> + <div class="ost"></div> <!-- Modal --> <div class="modal fade" id="saveModal"> diff --git a/web/ui/ui.js b/web/ui/ui.js index 718b6dc..9b5147e 100644 --- a/web/ui/ui.js +++ b/web/ui/ui.js @@ -20,7 +20,95 @@ $('#logout').click(fm_logout); fm_get_login(); fm_get_list(''); + fm_init_uploader(); } + +/* ----- Uploader Anfang ----------*/ + +var idNr; +var dateien = new Array(); +var sendet = false; + +function fm_init_uploader() { + var dropzone = document.getElementById("dateien"); + dropzone.ondragover = dropzone.ondragenter = function(event) { + event.stopPropagation(); + event.preventDefault(); + }; + + dropzone.ondrop = function(event) { + console.log('drop ' + event.dataTransfer.files[0]); + event.stopPropagation(); + event.preventDefault(); + + var filesArray = event.dataTransfer.files; + for (var i=0; i<filesArray.length; i++) { + //sendFile(filesArray[i]); + var datei = new Datei(++idNr, filesArray[i]); + dateien.push(datei); + dateiListen(datei); + } + naechsteDatei(); + }; +} + +function dateiListen(d) { + $('.ost').append(d.file.name); +} + +function naechsteDatei() { + if(!sendet && dateien.length > 0) { + sendFile(dateien.pop()); + } +} + +function sendFile(datei) { + + // Dateitabelle ergaenzen + /* + var elem = document.getElementById('dateitabelle'); + var tr = document.createElement('tr'); + var td = document.createElement('td'); + td.innerHTML = file.name; + tr.appendChild(td); + td = document.createElement('td'); + td.innerHTML = 'wird hochgeladen..'; + tr.appendChild(td); + elem.appendChild(tr); + */ + + //doNotImplemented(); + // Datei senden + var uri = "../api/upload"; // "../api/UploadFile"; //"/index.php"; + var xhr = new XMLHttpRequest(); + var fd = new FormData(); + + sendet = true; + xhr.open("POST", uri, true); + xhr.onreadystatechange = function() { + if (xhr.readyState == 4 && xhr.status == 200) { + //var td = document.getElementById('dateizeile' + datei.nr); + // Handle response. + //td.innerHTML = 'hochladen beendet'; + //alert(xhr.responseText + ' ' + index); // handle response. + sendet = false; + //window.setTimeout(function() { + fm_get_list(pfad); + naechsteDatei(); + //}, 1000); + } + }; + fd.append('dateiauswahlfeld', datei.file); + // Initiate a multipart/form-data upload + xhr.send(fd); +} + +function Datei (n, d) { + this.nr = n; + this.file = d; +} + +/* ----- Uploader Ende --------------- */ function fm_menu_test() { var w = $('.ost').width(); @@ -421,4 +509,5 @@ function BcrFile(rp, n) { this.relPath = rp; this.fName = n; -} \ No newline at end of file +} + -- Gitblit v1.9.3