Upload per Servlet: Exception

glubsch84

Grünschnabel
Hi,
ich möchte unter Zuhilfenahme eines Servlet Dateien auf meinen Server hochladen. Das Servlet basiert auf den commons.fileupload Klassen.
Bei kleinen Datein bis ca. 2MB arbeitet das Servlet auch ohne Probleme. Wenn die Dateien allerdings größer werden, bleibt das Servlet hängen und in die Log-Datei vom Tomcat wird eine Exception geschrieben.
Die Exception lautet:

FileUploadException -- Fehler beim upload
org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. null
at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:367)
at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)
at UploadServlet.doPost(UploadServlet.java:44)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:852)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:584)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1508)
at java.lang.Thread.run(Unknown Source)
Caused by: java.net.SocketTimeoutException
at org.apache.coyote.http11.InternalAprInputBuffer.fill(InternalAprInputBuffer.java:761)
at org.apache.coyote.http11.InternalAprInputBuffer$SocketInputBuffer.doRead(InternalAprInputBuffer.java:792)
at org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:116)
at org.apache.coyote.http11.InternalAprInputBuffer.doRead(InternalAprInputBuffer.java:703)
at org.apache.coyote.Request.doRead(Request.java:428)
at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:297)
at org.apache.tomcat.util.buf.ByteChunk.substract(ByteChunk.java:405)
at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:312)
at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:193)
at org.apache.commons.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:977)
at org.apache.commons.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:887)
at java.io.InputStream.read(Unknown Source)
at org.apache.commons.fileupload.util.Streams.copy(Streams.java:94)
at org.apache.commons.fileupload.util.Streams.copy(Streams.java:64)
at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:362)
... 16 more


Nun mein Code:
Code:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;

import java.util.Iterator;
import java.util.List;
 
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.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
 

 public class UploadServlet extends HttpServlet implements ProgressListener {


    private long megaBytes = -1;
    
    public void doPost(HttpServletRequest request,HttpServletResponse response) 
    {

        //Create a factory for disk-based file items
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        
        if(ServletFileUpload.isMultipartContent(request))
        {
            //uploadgrößen einstellen ==> größe unbegrenzt
            upload.setSizeMax(-1);
            upload.setFileSizeMax(-1);
            upload.setProgressListener(this);
           
            try 
            {
               //request parsen
               List files = upload.parseRequest(request);
               byte[] buffer = new byte[8192];
               for (Iterator iter = files.iterator(); iter.hasNext();) 
               {
                    FileItem element = (FileItem) iter.next();
                    
                    //behandlung einer Datei
                    if (!element.isFormField()) 
                    {
                        //Dateiname festlegen
                        String fileName = element.getName();
                        fileName = fileName.replace('/', '\\');
                        fileName = fileName.substring(fileName.lastIndexOf('\\') + 1);
                        
                        //Streams erstellen
                        InputStream is;
                        FileOutputStream fos;
                        try
                        {
                            //Datei auf Server erstellen
                            File datei = new File(getServletContext().getRealPath("WEB-INF//upload//" + fileName));
                            datei.createNewFile();
                            
                            is = element.getInputStream();
                            fos = new FileOutputStream(datei);
                            int len = 0;
                            
                            //Datei schreiben
                            while ((len = is.read(buffer)) > 0) 
                            {
                                fos.write(buffer, 0, len);
                                fos.flush();
                            }
                            
                            //Puffer leeren und Streams schliessen
                            fos.flush();
                            fos.close();
                            is.close();

                        } 
                        catch (IOException e)
                        {
                            //Exception abfangen
                            System.out.println("IOException -- Fehler beim schreiben der Datei");
                            e.printStackTrace();
                            e.getCause();
                        }
                    }
               }
            } 
            catch (FileUploadException e) 
            {
                System.out.println("FileUploadException -- Fehler beim upload");
                e.printStackTrace();
                e.getCause();
            }
            
            //Antwort schreiben
            response.setContentType("text/html");
            PrintWriter out;
            try
            {
                out = response.getWriter();
                out.println("<html>");
                out.println("<head>");
                out.println("<title> Upload erfolgreich</title>");
                out.println("</head>");
                out.println("<body>");
                out.println("<h1>Upload erfolgreich!</h1>");
                out.println("Die datei wurde hochgeladen!");
                out.println("</body></html>");
            } 
            catch (IOException e)
            {
                //Exception abfangen
                System.out.println("IOException -- Fehler beim schreiben der Antwort");
                e.printStackTrace();
                e.getCause();
            } 
        }
        else
        {
            response.setContentType("text/html");
            PrintWriter out;
            try
            {
                out = response.getWriter();
                out.println("<html>");
                out.println("<head>");
                out.println("<title> Upload fehlgeschlagen</title>");
                out.println("</head>");
                out.println("<body>");
                out.println("Upload fehlgeschlagen");
                out.println("kein multipart-request!");
                out.println("</body></html>");
            } 
            catch (IOException e)
            {
                //Exception abfangen
                System.out.println("IOException -- Fehler beim schreiben der Antwort");
                e.printStackTrace();
                e.getCause();
            } 
        }
    }
    
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException 
    {
        response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "GET is not allowed for uploads");
    }
    

    //Methode für ProgressListener
    public void update(long pBytesRead, long pContentLength, int pItems) 
    {
        long mBytes = pBytesRead / 1000000;
        if (megaBytes == mBytes) 
        {
            return;
        }
        
        megaBytes = mBytes;
        System.out.println("We are currently reading item " + pItems);
        if (pContentLength == -1) 
        {
            System.out.println("So far, " + pBytesRead + " bytes have been read.");
        } 
        else 
        {
            System.out.println("So far, " + pBytesRead + " of " + pContentLength
                               + " bytes have been read.");
        }
    }
 }

Schon mal vielen Dank im vorraus!

Grüße glubsch84
 
Für mich klingt das so als ob request null ist. Prüf dass doch mal vor dem parsen.
 
Am request liegts nicht. Hab den einfach mal mit ner if-Abfrage überprüft und lass dann ausgeben, ob der reuest gleich oder ungleich null ist.
Hier nochmal die Exception, allerdings mit der Ausgabe des ProgressListeners:


request ungleich null
We are currently reading item 0
So far, 4096 of 15662374 bytes have been read.
We are currently reading item 1
So far, 1001301 of 15662374 bytes have been read.
We are currently reading item 1
So far, 2001921 of 15662374 bytes have been read.
We are currently reading item 1
So far, 3002521 of 15662374 bytes have been read.
FileUploadException -- Fehler beim upload
org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. null
at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:367)
at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)
at UploadServlet.doPost(UploadServlet.java:53)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:852)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:584)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1508)
at java.lang.Thread.run(Unknown Source)
Caused by: java.net.SocketTimeoutException
at org.apache.coyote.http11.InternalAprInputBuffer.fill(InternalAprInputBuffer.java:761)
at org.apache.coyote.http11.InternalAprInputBuffer$SocketInputBuffer.doRead(InternalAprInputBuffer.java:792)
at org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:116)
at org.apache.coyote.http11.InternalAprInputBuffer.doRead(InternalAprInputBuffer.java:703)
at org.apache.coyote.Request.doRead(Request.java:428)
at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:297)
at org.apache.tomcat.util.buf.ByteChunk.substract(ByteChunk.java:405)
at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:312)
at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:193)
at org.apache.commons.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:977)
at org.apache.commons.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:887)
at java.io.InputStream.read(Unknown Source)
at org.apache.commons.fileupload.util.Streams.copy(Streams.java:94)
at org.apache.commons.fileupload.util.Streams.copy(Streams.java:64)
at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:362)
... 16 more
 
Dank der ganzen Exception sieht man nun auch was das Problem ist:
Caused by: java.net.SocketTimeoutException

Der Transfer dauert offenbar zu lange und dann wird die Verbindung unterbrochen.
 
Hmm, das ist schon irgendwie komisch. Ich hab das lokal laufen. Der Transfer dürfte daher eigentlich so schnell gehen, das der Socket keinen Timeout bekommen dürfte. Ich versteh auch nicht wieso überhaupt ein Timeout kommt. Über den Socket laufen doch die ganze Zeit Daten!
Was mich vor allem daran stört, dass es nicht geht, ist, dass ich mich eigentlich recht nah an der Anleitung von von apache gehalten hab! http://commons.apache.org/fileupload/using.html
 

Neue Beiträge

Zurück