[FILEUPLOAD-210] #comment as requested by the user, added a new method that maps each FileItem to its related field name, so users can access to them by key #resolved
git-svn-id: https://svn.apache.org/repos/asf/commons/proper/fileupload/trunk@1455515 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index bb0894b..9e4cb28 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -75,6 +75,7 @@
* [FILEUPLOAD-182] - Documentation: add simple HTML form example to fileupload user guide
* [FILEUPLOAD-207] - enhance file read/write performance
* [FILEUPLOAD-209] - Add Support for Generic Types
+ * [FILEUPLOAD-210] - Process HTTP Requests Into Maps
* [FILEUPLOAD-223] - Update commons-io dependency to latest version that supports JDK1.5
* [FILEUPLOAD-224] - Avoid string concatenations while parsing headers, use buffers instead
* [FILEUPLOAD-225] - Replace java.rmi.server.UID() with java.util.UUID
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 95430d5..7fddc9b 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -122,6 +122,9 @@
<action issue="FILEUPLOAD-209" dev="simonetripodi" type="add" due-to="Fernando Ribeiro">
Add Support for Generic Types
</action>
+ <action issue="FILEUPLOAD-210" dev="simonetripodi" type="add" due-to="Fernando Ribeiro">
+ Process HTTP Requests Into Maps
+ </action>
<action issue="FILEUPLOAD-223" dev="simonetripodi" type="update" due-to="">
Update commons-io dependency to latest version that supports JDK1.5
</action>
diff --git a/src/main/java/org/apache/commons/fileupload/FileUploadBase.java b/src/main/java/org/apache/commons/fileupload/FileUploadBase.java
index ca1bc8b..4622fa2 100644
--- a/src/main/java/org/apache/commons/fileupload/FileUploadBase.java
+++ b/src/main/java/org/apache/commons/fileupload/FileUploadBase.java
@@ -372,6 +372,39 @@
}
}
+ /**
+ * Processes an <a href="http://www.ietf.org/rfc/rfc1867.txt">RFC 1867</a>
+ * compliant <code>multipart/form-data</code> stream.
+ *
+ * @param ctx The context for the request to be parsed.
+ *
+ * @return A map of <code>FileItem</code> instances parsed from the request.
+ *
+ * @throws FileUploadException if there are problems reading/parsing
+ * the request or storing files.
+ *
+ * @since 1.3
+ */
+ public Map<String, List<FileItem>> parseParameterMap(RequestContext ctx)
+ throws FileUploadException {
+ final List<FileItem> items = parseRequest(ctx);
+ final Map<String, List<FileItem>> itemsMap = new HashMap<String, List<FileItem>>(items.size());
+
+ for (FileItem fileItem : items) {
+ String fieldName = fileItem.getFieldName();
+ List<FileItem> mappedItems = itemsMap.get(fieldName);
+
+ if (mappedItems == null) {
+ mappedItems = new ArrayList<FileItem>();
+ itemsMap.put(fieldName, mappedItems);
+ }
+
+ mappedItems.add(fileItem);
+ }
+
+ return itemsMap;
+ }
+
// ------------------------------------------------------ Protected methods
/**
diff --git a/src/test/java/org/apache/commons/fileupload/ServletFileUploadTest.java b/src/test/java/org/apache/commons/fileupload/ServletFileUploadTest.java
index fae7119..115b5a0 100644
--- a/src/test/java/org/apache/commons/fileupload/ServletFileUploadTest.java
+++ b/src/test/java/org/apache/commons/fileupload/ServletFileUploadTest.java
@@ -25,9 +25,13 @@
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;
+import java.util.Map;
import javax.servlet.http.HttpServletRequest;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.apache.commons.fileupload.servlet.ServletFileUpload;
+import org.apache.commons.fileupload.servlet.ServletRequestContext;
import org.junit.Test;
/**
@@ -356,6 +360,46 @@
assertHeaders(headerNames, headerValues, multi1, 3);
}
+ /**
+ * Test case for <a href="http://issues.apache.org/jira/browse/FILEUPLOAD-210">
+ */
+ @Test
+ public void parseParameterMap()
+ throws Exception {
+ String text = "-----1234\r\n" +
+ "Content-Disposition: form-data; name=\"file\"; filename=\"foo.tab\"\r\n" +
+ "Content-Type: text/whatever\r\n" +
+ "\r\n" +
+ "This is the content of the file\n" +
+ "\r\n" +
+ "-----1234\r\n" +
+ "Content-Disposition: form-data; name=\"field\"\r\n" +
+ "\r\n" +
+ "fieldValue\r\n" +
+ "-----1234\r\n" +
+ "Content-Disposition: form-data; name=\"multi\"\r\n" +
+ "\r\n" +
+ "value1\r\n" +
+ "-----1234\r\n" +
+ "Content-Disposition: form-data; name=\"multi\"\r\n" +
+ "\r\n" +
+ "value2\r\n" +
+ "-----1234--\r\n";
+ byte[] bytes = text.getBytes("US-ASCII");
+ ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory());
+ HttpServletRequest request = new MockHttpServletRequest(bytes, CONTENT_TYPE);
+
+ Map<String, List<FileItem>> mappedParameters = upload.parseParameterMap(new ServletRequestContext(request));
+ assertTrue(mappedParameters.containsKey("file"));
+ assertEquals(1, mappedParameters.get("file").size());
+
+ assertTrue(mappedParameters.containsKey("field"));
+ assertEquals(1, mappedParameters.get("field").size());
+
+ assertTrue(mappedParameters.containsKey("multi"));
+ assertEquals(2, mappedParameters.get("multi").size());
+ }
+
private void assertHeaders(String[] pHeaderNames, String[] pHeaderValues,
FileItem pItem, int pIndex) {
for (int i = 0; i < pHeaderNames.length; i++) {