package javacodebook.server.upload;

import java.io.*;
import java.util.*;

import javax.servlet.*;
import javax.servlet.http.*;

import org.apache.commons.fileupload.*;

/**
 *  Ein Beispiel für File-Upload mit Hilfe eines Formulars und dem Input-Typ "file".
 */
public class FileUploadServlet extends HttpServlet {

    //Das Zielverzeichis, in das letztendlich alle hochgeladenen Dateien
    //kopiert werden sollen (in der Form c:\tmp oder /tmp
    private File targetDir;

    /** Beim Initialisieren wird das Verzeichnis ausgelesen, in das die
     *  hochgeladenen Dateien gespeichert werden sollen. Es wird in der Datei
     *  web.xml angegeben.
     */
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        try {
            //hier kann eine NullPointerException geworfen werden, wenn der
            //Parameter nicht gesetzt ist
            targetDir = new File(config.getInitParameter("target_dir"));
            if(!targetDir.exists() || !targetDir.isDirectory())
                throw new IOException();
        } catch(Exception e) {
            throw new ServletException("Init-Parameter target_dir "
                    + "falsch gesetzt");
        }
    }

    /** Datei-Upload muss mit der Post-Methode erfolgen. Daher wird hier die
     * doPost()-Methode verwendet. Mit Hilfe der Klasse FileUpload wird der
     * Datenstrom ausgewertet, den der Browser an das Servlet schickt. Er ist
     * als MIME-Datenstrom kodiert (RFC 1867).
     */
    protected void doPost(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, java.io.IOException {
        res.setContentType("text/html");
        PrintWriter out = res.getWriter();
        out.println("<html>");
        out.println("<body>");

        //Für das Parsen des Multipart-Requests wird ein FileUpload-Objekt verwendet
        FileUpload fileUpload = new FileUpload();
        //maximal hochgeladene Datenmenge (Formularfelder + Dateien)
        fileUpload.setSizeMax(1000000);
        //Im Speicher gehaltener Cache
        fileUpload.setSizeThreshold(4096);
        //Speicherort/temporäres Verzeichnis für die hochgeladenen Daten
        ServletConfig config = getServletConfig();
        ServletContext context = config.getServletContext();
        File tmpDir = (File)context.getAttribute("javax.servlet.context.tempdir");
        fileUpload.setRepositoryPath(tmpDir.getAbsolutePath());

        //Hier erfolgt das eigentliche Parsen des Requests und die Auswertung
        try {
            List fileItems = fileUpload.parseRequest(req);
            out.println("Folgende Daten wurden übermittelt:<br>");
            Iterator i = fileItems.iterator();
            //Alle übermittelten Formularfelder und Dateien durchgehen und
            //entsprechende Auswertungen vornehmen
            while(i.hasNext())
            {
                FileItem item = (FileItem) i.next();
                if (item.isFormField()) {
                    //Es handelt sich um ein Formular-Feld
                    out.println(item.getFieldName() + "=" + item.getString() + "<br>");
                } else {
                    //Es handelt sich um eine Datei-Upload-Feld -> erst
                    //überprüfen, ob eine Datei vorhanden ist
                    if(item.getStoreLocation() != null)
                    {
                        out.println(item.getFieldName() + "=" + item.getName() + "<br>");
                        //Die temporäre Datei wird in ein definiertes Zielverzeichnis
                        //kopiert
                        item.write(targetDir + File.separator + item.getName());
                    }
                }
            }
        } catch(Exception e) {
            e.printStackTrace(out);
        }

        out.println("</body>");
        out.println("</html>");
        out.close();
    }

}
