Adding streaming support to MultipartHttpServletRequest.java
This commit is contained in:
parent
1b07173e7c
commit
2b5af0f084
2 changed files with 53 additions and 17 deletions
|
@ -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;
|
||||||
|
|
|
@ -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,14 +106,16 @@ 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);
|
||||||
log.debug("Parameters are: " + this.parameters);
|
log.debug("Parameters are: " + this.parameters);
|
||||||
this.files = Collections.unmodifiableMap(files);
|
this.files = Collections.unmodifiableMap(files);
|
||||||
log.debug("Files are: " + this.files);
|
log.debug("Files are: " + this.files);
|
||||||
request.setAttribute(FILE_ITEM_MAP, this.files);
|
request.setAttribute(FILE_ITEM_MAP, this.files);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pull any parameters out of the URL.
|
* Pull any parameters out of the URL.
|
||||||
|
@ -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.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue