users@jersey.java.net

Large file upload

From: Ersin Er <ersin.er_at_gmail.com>
Date: Wed, 24 Mar 2010 17:38:46 +0200

Hi,

I have managed to upload file with a bunch of code like the following:

  @POST
  @Path("/upload")
  @Consumes("multipart/form-data")
  @Produces("text/plain")
  public String upload(@FormParam("file") File file) {
      return "Done.";
  }

The first question is whether this is a correct way of uploading (big)
files?

My second question is related to the problem I face with. Although this code
works fine for small files, I get heap memory exception for large files
although I have reserved more than enough amount of memory such as 2GB. I
get the following exception trace:

javax.servlet.ServletException: Servlet execution threw an exception
</pre></p><p><b>root cause</b> <pre>java.lang.OutOfMemoryError: Java heap
space
 java.util.Arrays.copyOf(Arrays.java:2882)
java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
 java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:515)
java.lang.StringBuilder.append(StringBuilder.java:189)

com.sun.jersey.core.util.ReaderWriter.readFromAsString(ReaderWriter.java:159)
com.sun.jersey.core.provider.AbstractMessageReaderWriterProvider.readFromAsString(AbstractMessageReaderWriterProvider.java:111)

com.sun.jersey.core.impl.provider.entity.BaseFormProvider.readFrom(BaseFormProvider.java:62)
com.sun.jersey.core.impl.provider.entity.FormProvider.readFrom(FormProvider.java:70)

com.sun.jersey.core.impl.provider.entity.FormProvider.readFrom(FormProvider.java:57)
com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:444)

com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:453)
com.sun.jersey.server.impl.model.method.dispatch.FormDispatchProvider.processForm(FormDispatchProvider.java:93)

com.sun.jersey.server.impl.model.method.dispatch.FormDispatchProvider$FormParameterProvider.getInjectableValues(FormDispatchProvider.java:105)
com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$EntityParamInInvoker.getParams(AbstractResourceMethodDispatchProvider.java:119)

com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:147)

com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:67)
com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:259)

com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:133)
com.sun.jersey.server.impl.uri.rules.ResourceObjectRule.accept(ResourceObjectRule.java:81)

com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:133)
com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:71)

com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:990)
com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:941)

com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:932)
com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:384)

com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:451)
com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:632)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

I get this exception when I try to upload a file of size about 300MB.

One another note is that I do not yet use jersey-multipart and I do not know
whether it can help here.

Any suggestions?

-- 
Ersin