Hey, Chris,

I checked the temp directory in catalina.sh and also by adding this line to the the ContextListener class:

        System.out.println("Temp dir: "
                + (event.getServletContext()
                        .getAttribute("javax.servlet.context.tempdir"))
                        .toString());

The latter is a subdirectory of the former; Tomcat has read/write access to both places.

I do create a temporary local copy of the image on disk (by using native Java IO classes), so I am able to access the file system without a problem (ultimately, the images are stored in a database). It looks like fileupload is meant to store a temporary version of the image during the upload, presumably to minimize memory usage. This is where the fail is happening, if the image exceeds the threshold size. I've monitored both temporary directories during the upload, and indeed nothing is being written to them.

I guess I can increase the threshold size to a higher value to prevent the exception by avoiding the file system write altogether, but I worry that if the application has many users uploading large images concurrently, this set up will quickly lead to fatal out of memory errors. :(

I've sent an inquiry to the apache commons user mailing list. I will follow up here when I hear back.

Thanks again for all your advice.

Best,
Paul


On 9/1/10 10:25 PM, Christopher Schultz wrote:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Paul,

On 9/1/2010 6:58 PM, Paul Szynol wrote:
Ah, now I see what you mean.  So the reason the exception isn't being
thrown when I increase the threshold value is that the image isn't being
written to disk in the first place.  That makes more sense.  But the odd
part of it (in my configuration, at least) is that the file permissions
do allow fileupload to write the file...so, I guess I still don't
understand what's causing the exception.
I'm reading this: http://commons.apache.org/fileupload/using.html

Are you calling factory.setRepository(File)?

If not, you're getting whatever the default is, which is
System.getProperty("java.io.tmpdir"), which might actually be "/" in
your case.

You should probably be doing something like this:

ServletContext app = request.getServletContext();
factory.setRepository((File)app.getAttribute("javax.servlet.context.tempdir"));

ServletFileUpload upload = new ServletFileUpload(factory);

...

This will allow commons-fileupload to use the spec-defined scratch
directory for files your webapp needs to write. Be aware that the spec
makes no statements about how much stuff you can shove into that
directory, so some containers may limit you in some way (I don't believe
Tomcat has any such limits, but YMMV).

Good luck,
- -chris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (MingW32)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEUEARECAAYFAkx/CwgACgkQ9CaO5/Lv0PC9SgCXfnK0xldzZFPal+Masbn6yM3u
SQCeK1ku59wniXGJupko/2bclOVkyjI=
=wtBx
-----END PGP SIGNATURE-----

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org



---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to