You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2007/12/20 14:31:47 UTC
svn commit: r605921 - in /incubator/sling/trunk/microsling/microsling-core:
pom.xml
src/main/java/org/apache/sling/microsling/request/helpers/SlingRequestParameterMap.java
Author: bdelacretaz
Date: Thu Dec 20 05:31:46 2007
New Revision: 605921
URL: http://svn.apache.org/viewvc?rev=605921&view=rev
Log:
SLING-144 - multipart form support for microsling, thanks to Philipp Koch
Modified:
incubator/sling/trunk/microsling/microsling-core/pom.xml
incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/request/helpers/SlingRequestParameterMap.java
Modified: incubator/sling/trunk/microsling/microsling-core/pom.xml
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/microsling/microsling-core/pom.xml?rev=605921&r1=605920&r2=605921&view=diff
==============================================================================
--- incubator/sling/trunk/microsling/microsling-core/pom.xml (original)
+++ incubator/sling/trunk/microsling/microsling-core/pom.xml Thu Dec 20 05:31:46 2007
@@ -166,7 +166,12 @@
<groupId>org.slf4j</groupId>
<artifactId>jcl104-over-slf4j</artifactId>
<version>1.3.0</version>
- </dependency>
+ </dependency>
+ <dependency>
+ <groupId>commons-fileupload</groupId>
+ <artifactId>commons-fileupload</artifactId>
+ <version>1.1.1</version>
+ </dependency>
</dependencies>
<build>
Modified: incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/request/helpers/SlingRequestParameterMap.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/request/helpers/SlingRequestParameterMap.java?rev=605921&r1=605920&r2=605921&view=diff
==============================================================================
--- incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/request/helpers/SlingRequestParameterMap.java (original)
+++ incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/request/helpers/SlingRequestParameterMap.java Thu Dec 20 05:31:46 2007
@@ -21,13 +21,21 @@
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
+import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
+import java.util.Iterator;
+import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.sling.api.request.RequestParameter;
import org.apache.sling.api.request.RequestParameterMap;
+import org.apache.commons.fileupload.servlet.ServletFileUpload;
+import org.apache.commons.fileupload.FileUploadException;
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.FileItemFactory;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
/**
* The <code>SlingRequestParameterMap</code> implements the
@@ -39,14 +47,16 @@
/** Create from the HTTP request parameters */
public SlingRequestParameterMap(HttpServletRequest request) {
- Map<?, ?> parameters = request.getParameterMap();
- for (Map.Entry<?, ?> entry : parameters.entrySet()) {
- String[] values = (String[]) entry.getValue();
- RequestParameter[] rpValues = new RequestParameter[values.length];
- for (int i = 0; i < values.length; i++) {
- rpValues[i] = new SimpleRequestParameter(values[i]);
+ if (ServletFileUpload.isMultipartContent(request)) {
+ try {
+ initializeMultipart(request);
+ } catch (UnsupportedEncodingException e) {
+ // ignore for the moment
+ } catch (FileUploadException e) {
+ // ignore for the moment
}
- put((String) entry.getKey(), rpValues);
+ } else {
+ initializeStandard(request);
}
}
@@ -59,17 +69,58 @@
return (values != null && values.length > 0) ? values[0] : null;
}
+ /** initialize from a non-multipart request */
+ private void initializeStandard(HttpServletRequest request) {
+ Map<?, ?> parameters = request.getParameterMap();
+ for (Map.Entry<?, ?> entry : parameters.entrySet()) {
+ String[] values = (String[]) entry.getValue();
+ RequestParameter[] rpValues = new RequestParameter[values.length];
+ for (int i = 0; i < values.length; i++) {
+ rpValues[i] = new SimpleRequestParameter(values[i]);
+ }
+ put((String) entry.getKey(), rpValues);
+ }
+ }
+
+ /** initialize from a multipart request */
+ private void initializeMultipart(HttpServletRequest request)
+ throws FileUploadException,UnsupportedEncodingException {
+ // use commons fileupload to parse request
+ FileItemFactory factory = new DiskFileItemFactory();
+ ServletFileUpload upload = new ServletFileUpload(factory);
+ List items = upload.parseRequest(request);
+
+ for(Iterator it = items.iterator(); it.hasNext(); ) {
+ final FileItem fi = (FileItem)it.next();
+ put(fi.getFieldName(), new RequestParameter[] {new SimpleRequestParameter(fi)});
+ }
+ }
+
/** Simple implementation of the RequestParameter interface */
private static class SimpleRequestParameter implements RequestParameter {
private String value;
+ private FileItem fileItem;
+
private byte[] cachedBytes;
SimpleRequestParameter(String value) {
this.value = value;
}
+ SimpleRequestParameter(FileItem fi) {
+ if(fi.isFormField()) {
+ // TODO: FileItem does not seem to support multiple values
+ // if there are multiple values we lose them
+ value = fi.getString();
+ fileItem = null;
+ } else {
+ value = null;
+ fileItem = fi;
+ }
+ }
+
/**
* Convert the parameter string value to a byte[] using ISO-8859-1
* encoding, which is assumed to be the default for parameters
@@ -92,11 +143,18 @@
}
public String getFileName() {
- return null;
+ return fileItem.getName();
}
public InputStream getInputStream() {
- return new ByteArrayInputStream(get());
+ if (value != null) {
+ return new ByteArrayInputStream(get());
+ } else {
+ try {
+ return fileItem.getInputStream();
+ } catch (IOException ioe) {}
+ }
+ return new ByteArrayInputStream(new byte[0]);
}
public long getSize() {