Adding streaming support to MultipartHttpServletRequest.java

This commit is contained in:
Brian Caruso 2013-07-15 14:12:42 -04:00
parent 1b07173e7c
commit 2b5af0f084
2 changed files with 53 additions and 17 deletions

View file

@ -2,21 +2,12 @@
package edu.cornell.mannlib.vitro.webapp.filestorage.uploadrequest; package edu.cornell.mannlib.vitro.webapp.filestorage.uploadrequest;
import java.io.BufferedReader;
import java.io.IOException; import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.Principal;
import java.util.Enumeration;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Map; 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.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpSession;
import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.FileUploadException;

View file

@ -29,29 +29,60 @@ import org.apache.commons.logging.LogFactory;
* any parameter-related requests. File-related information will also be held * any parameter-related requests. File-related information will also be held
* here, to answer file-related requests. * here, to answer file-related requests.
*/ */
class MultipartHttpServletRequest extends FileUploadServletRequest { public class MultipartHttpServletRequest extends FileUploadServletRequest {
private static final Log log = LogFactory private static final Log log = LogFactory
.getLog(MultipartHttpServletRequest.class); .getLog(MultipartHttpServletRequest.class);
private static final String[] EMPTY_ARRAY = new String[0]; private static final String[] EMPTY_ARRAY = new String[0];
private final Map<String, List<String>> parameters; private Map<String, List<String>> parameters;
private final Map<String, List<FileItem>> files; private Map<String, List<FileItem>> files;
private FileUploadException fileUploadException; 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 * 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, public MultipartHttpServletRequest(HttpServletRequest request,
int maxFileSize) throws IOException { int maxFileSize) throws IOException {
super(request); super(request);
storeFilesToTempDir = true;
this.maxFileSize = maxFileSize;
this.tempDir = figureTemporaryDirectory(request);
}
private void setup(HttpServletRequest request){
Map<String, List<String>> parameters = new HashMap<String, List<String>>(); Map<String, List<String>> parameters = new HashMap<String, List<String>>();
Map<String, List<FileItem>> files = new HashMap<String, List<FileItem>>(); Map<String, List<FileItem>> files = new HashMap<String, List<FileItem>>();
File tempDir = figureTemporaryDirectory(request); ServletFileUpload upload = createUploadHandler();
ServletFileUpload upload = createUploadHandler(maxFileSize, tempDir);
//File tempDir = figureTemporaryDirectory(request);
//ServletFileUpload upload = createUploadHandler(maxFileSize, tempDir);
parseQueryString(request.getQueryString(), parameters); parseQueryString(request.getQueryString(), parameters);
@ -75,6 +106,8 @@ class MultipartHttpServletRequest extends FileUploadServletRequest {
fileUploadException = e; fileUploadException = e;
request.setAttribute( request.setAttribute(
FileUploadServletRequest.FILE_UPLOAD_EXCEPTION, e); FileUploadServletRequest.FILE_UPLOAD_EXCEPTION, e);
} catch (UnsupportedEncodingException e) {
log.error("could not convert to UTF-8",e);
} }
this.parameters = Collections.unmodifiableMap(parameters); this.parameters = Collections.unmodifiableMap(parameters);
@ -131,6 +164,18 @@ class MultipartHttpServletRequest extends FileUploadServletRequest {
"javax.servlet.context.tempdir"); "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 * Create an upload handler that will throw an exception if the file is too
* large. * large.