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:
Schon mal vielen Dank im vorraus!
Grüße glubsch84
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