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">
-        &ouml;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