001: /*
002: * FileUploadRequest.java
003: *
004: * Version: $Revision: 2491 $
005: *
006: * Date: $Date: 2008-01-08 11:53:25 -0600 (Tue, 08 Jan 2008) $
007: *
008: * Copyright (c) 2002-2005, Hewlett-Packard Company and Massachusetts
009: * Institute of Technology. All rights reserved.
010: *
011: * Redistribution and use in source and binary forms, with or without
012: * modification, are permitted provided that the following conditions are
013: * met:
014: *
015: * - Redistributions of source code must retain the above copyright
016: * notice, this list of conditions and the following disclaimer.
017: *
018: * - Redistributions in binary form must reproduce the above copyright
019: * notice, this list of conditions and the following disclaimer in the
020: * documentation and/or other materials provided with the distribution.
021: *
022: * - Neither the name of the Hewlett-Packard Company nor the name of the
023: * Massachusetts Institute of Technology nor the names of their
024: * contributors may be used to endorse or promote products derived from
025: * this software without specific prior written permission.
026: *
027: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
028: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
029: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
030: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
031: * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
032: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
033: * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
034: * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
035: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
036: * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
037: * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
038: * DAMAGE.
039: */
040: package org.dspace.app.webui.util;
041:
042: import java.io.File;
043: import java.io.IOException;
044: import java.util.Collection;
045: import java.util.Collections;
046: import java.util.Enumeration;
047: import java.util.HashMap;
048: import java.util.Iterator;
049: import java.util.List;
050: import java.util.Map;
051: import java.util.Vector;
052:
053: import javax.servlet.http.HttpServletRequest;
054: import javax.servlet.http.HttpServletRequestWrapper;
055:
056: import org.apache.commons.fileupload.DiskFileUpload;
057: import org.apache.commons.fileupload.FileItem;
058: import org.dspace.core.ConfigurationManager;
059:
060: /**
061: * Based on the com.oreilly.servlet.MultipartWrapper object, this is an HTTP
062: * request wrapper for multi-part (MIME) POSTs. It uses DSpace configuration
063: * properties to determine the temporary directory to use and the maximum
064: * allowable upload size.
065: *
066: * @author Robert Tansley
067: * @version $Revision: 2491 $
068: */
069: public class FileUploadRequest extends HttpServletRequestWrapper {
070:
071: /** Multipart request */
072: private List items = null;
073:
074: private HashMap parameters = new HashMap();
075:
076: private HashMap fileitems = new HashMap();
077:
078: private Vector filenames = new Vector();
079:
080: private String tempDir = null;
081:
082: /** Original request */
083: private HttpServletRequest original = null;
084:
085: /**
086: * Parse a multipart request and extracts the files
087: *
088: * @param req
089: * the original request
090: */
091: public FileUploadRequest(HttpServletRequest req) throws IOException {
092: super (req);
093:
094: original = req;
095:
096: tempDir = ConfigurationManager.getProperty("upload.temp.dir");
097: int maxSize = ConfigurationManager.getIntProperty("upload.max");
098:
099: DiskFileUpload upload = new DiskFileUpload();
100:
101: try {
102: upload.setRepositoryPath(tempDir);
103: upload.setSizeMax(maxSize);
104: items = upload.parseRequest(req);
105: for (Iterator i = items.iterator(); i.hasNext();) {
106: FileItem item = (FileItem) i.next();
107: if (item.isFormField()) {
108: parameters.put(item.getFieldName(), item
109: .getString("UTF-8"));
110: } else {
111: parameters.put(item.getFieldName(), item.getName());
112: fileitems.put(item.getFieldName(), item);
113: filenames.add(item.getName());
114:
115: String filename = getFilename(item.getName());
116: if (filename != null && !"".equals(filename)) {
117: item.write(new File(tempDir + File.separator
118: + filename));
119: }
120: }
121: }
122: } catch (Exception e) {
123: IOException t = new IOException(e.getMessage());
124: t.initCause(e);
125: throw t;
126: }
127: }
128:
129: // Methods to replace HSR methods
130: public Enumeration getParameterNames() {
131: Collection c = parameters.keySet();
132: return Collections.enumeration(c);
133: }
134:
135: public String getParameter(String name) {
136: return (String) parameters.get(name);
137: }
138:
139: public String[] getParameterValues(String name) {
140: return (String[]) parameters.values().toArray();
141: }
142:
143: public Map getParameterMap() {
144: Map map = new HashMap();
145: Enumeration eNum = getParameterNames();
146:
147: while (eNum.hasMoreElements()) {
148: String name = (String) eNum.nextElement();
149: map.put(name, getParameterValues(name));
150: }
151:
152: return map;
153: }
154:
155: public String getFilesystemName(String name) {
156: String filename = getFilename(((FileItem) fileitems.get(name))
157: .getName());
158: return tempDir + File.separator + filename;
159: }
160:
161: public String getContentType(String name) {
162: return ((FileItem) fileitems.get(name)).getContentType();
163: }
164:
165: public File getFile(String name) {
166: FileItem temp = (FileItem) fileitems.get(name);
167: String tempName = temp.getName();
168: String filename = getFilename(tempName);
169: if ("".equals(filename.trim())) {
170: return null;
171: }
172: return new File(tempDir + File.separator + filename);
173: }
174:
175: public Enumeration getFileParameterNames() {
176: Collection c = fileitems.keySet();
177: return Collections.enumeration(c);
178: }
179:
180: public Enumeration getFileNames() {
181: return filenames.elements();
182: }
183:
184: /**
185: * Get back the original HTTP request object
186: *
187: * @return the original HTTP request
188: */
189: public HttpServletRequest getOriginalRequest() {
190: return original;
191: }
192:
193: // Required due to the fact the contents of getName() may vary based on
194: // browser
195: private String getFilename(String filepath) {
196: String filename = filepath.trim();
197:
198: int index = filepath.lastIndexOf(File.separator);
199: if (index > -1) {
200: filename = filepath.substring(index);
201: }
202: return filename;
203: }
204: }
|