diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/uploadrequest/FileUploadServletRequest.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/uploadrequest/FileUploadServletRequest.java index ca564ea3c..8f795df1c 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/uploadrequest/FileUploadServletRequest.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/uploadrequest/FileUploadServletRequest.java @@ -2,21 +2,12 @@ package edu.cornell.mannlib.vitro.webapp.filestorage.uploadrequest; -import java.io.BufferedReader; import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.security.Principal; -import java.util.Enumeration; import java.util.List; -import java.util.Locale; import java.util.Map; -import javax.servlet.RequestDispatcher; -import javax.servlet.ServletInputStream; -import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; -import javax.servlet.http.HttpSession; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/uploadrequest/MultipartHttpServletRequest.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/uploadrequest/MultipartHttpServletRequest.java index 2df1daa0c..b78da5318 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/uploadrequest/MultipartHttpServletRequest.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/uploadrequest/MultipartHttpServletRequest.java @@ -29,29 +29,60 @@ import org.apache.commons.logging.LogFactory; * any parameter-related requests. File-related information will also be held * here, to answer file-related requests. */ -class MultipartHttpServletRequest extends FileUploadServletRequest { +public class MultipartHttpServletRequest extends FileUploadServletRequest { private static final Log log = LogFactory .getLog(MultipartHttpServletRequest.class); private static final String[] EMPTY_ARRAY = new String[0]; - private final Map> parameters; - private final Map> files; + private Map> parameters; + private Map> files; private FileUploadException fileUploadException; + private boolean storeFilesToTempDir = false; + private int maxFileSize = 0; + private File tempDir = null; + + /** + * Parse the multipart request. Store the info about the request parameters. + * Don't store the uploaded files to a temporary directory to allow streaming. + * + * Only use this constructor if you plan to consume the FileItems using streaming + * to deal with inputs of very large sizes. + * + * In all other case you should use the maxFileSize constructor to deal with + * the size of the uploaded file in a safe way. + */ + public MultipartHttpServletRequest(HttpServletRequest request) + throws IOException{ + super(request); + storeFilesToTempDir = false; + + } + /** * Parse the multipart request. Store the info about the request parameters - * and the uploaded files. + * and the uploaded files to a temporary directory. + * + * This offers a simple way to deal with uploaded files by having a size + * limit. This limit may be rather large if desired. Many megabytes for example. */ public MultipartHttpServletRequest(HttpServletRequest request, int maxFileSize) throws IOException { super(request); + storeFilesToTempDir = true; + this.maxFileSize = maxFileSize; + this.tempDir = figureTemporaryDirectory(request); + } + private void setup(HttpServletRequest request){ Map> parameters = new HashMap>(); Map> files = new HashMap>(); - File tempDir = figureTemporaryDirectory(request); - ServletFileUpload upload = createUploadHandler(maxFileSize, tempDir); + ServletFileUpload upload = createUploadHandler(); + + //File tempDir = figureTemporaryDirectory(request); + //ServletFileUpload upload = createUploadHandler(maxFileSize, tempDir); parseQueryString(request.getQueryString(), parameters); @@ -75,14 +106,16 @@ class MultipartHttpServletRequest extends FileUploadServletRequest { fileUploadException = e; request.setAttribute( FileUploadServletRequest.FILE_UPLOAD_EXCEPTION, e); - } + } catch (UnsupportedEncodingException e) { + log.error("could not convert to UTF-8",e); + } this.parameters = Collections.unmodifiableMap(parameters); log.debug("Parameters are: " + this.parameters); this.files = Collections.unmodifiableMap(files); log.debug("Files are: " + this.files); request.setAttribute(FILE_ITEM_MAP, this.files); - } + } /** * Pull any parameters out of the URL. @@ -131,6 +164,18 @@ class MultipartHttpServletRequest extends FileUploadServletRequest { "javax.servlet.context.tempdir"); } + + /** + * Create an upload handler based on this.storeFilesToTempDir. + */ + private ServletFileUpload createUploadHandler(){ + if( storeFilesToTempDir ){ + return createUploadHandler( this.maxFileSize, this.tempDir ); + }else{ + return new ServletFileUpload(); + } + } + /** * Create an upload handler that will throw an exception if the file is too * large.