You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2015/06/26 13:41:44 UTC

wicket git commit: WICKET-5924 FileUploadField does not work with Spring Boot

Repository: wicket
Updated Branches:
  refs/heads/WICKET-5924-fallback-to-servlet-parts [created] e27588e9e


WICKET-5924 FileUploadField does not work with Spring Boot

Add support for reading file uploads from Servlet request's parts


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/e27588e9
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/e27588e9
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/e27588e9

Branch: refs/heads/WICKET-5924-fallback-to-servlet-parts
Commit: e27588e9e8d1cce0cb355a3629d927ed7e039c4a
Parents: 7d90522
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Fri Jun 26 14:40:33 2015 +0300
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Fri Jun 26 14:40:33 2015 +0300

----------------------------------------------------------------------
 .../servlet/MultipartServletWebRequestImpl.java | 187 ++++++++++++++++++-
 1 file changed, 186 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/e27588e9/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/MultipartServletWebRequestImpl.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/MultipartServletWebRequestImpl.java b/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/MultipartServletWebRequestImpl.java
index 3609b3b..46aafb0 100644
--- a/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/MultipartServletWebRequestImpl.java
+++ b/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/MultipartServletWebRequestImpl.java
@@ -16,28 +16,37 @@
  */
 package org.apache.wicket.protocol.http.servlet;
 
+import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.Part;
 
 import org.apache.commons.fileupload.FileItem;
 import org.apache.commons.fileupload.FileItemFactory;
+import org.apache.commons.fileupload.FileItemHeaders;
 import org.apache.commons.fileupload.FileUploadBase;
 import org.apache.commons.fileupload.FileUploadException;
 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
 import org.apache.commons.fileupload.servlet.ServletFileUpload;
 import org.apache.commons.fileupload.servlet.ServletRequestContext;
+import org.apache.commons.fileupload.util.FileItemHeadersImpl;
 import org.apache.commons.io.FileCleaningTracker;
 import org.apache.wicket.Application;
 import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.util.file.FileCleanerTrackerAdapter;
 import org.apache.wicket.util.file.IFileCleaner;
+import org.apache.wicket.util.io.ByteArrayOutputStream;
+import org.apache.wicket.util.io.Streams;
 import org.apache.wicket.util.lang.Args;
 import org.apache.wicket.util.lang.Bytes;
 import org.apache.wicket.util.string.StringValue;
@@ -162,7 +171,7 @@ public class MultipartServletWebRequestImpl extends MultipartServletWebRequest
 
 		FileUploadBase fileUpload = newFileUpload(encoding);
 
-		final List<FileItem> items;
+		List<FileItem> items;
 
 		if (wantUploadProgressUpdates())
 		{
@@ -189,6 +198,10 @@ public class MultipartServletWebRequestImpl extends MultipartServletWebRequest
 		else
 		{
 			items = fileUpload.parseRequest(new ServletRequestContext(request));
+			if (items.isEmpty())
+			{
+				items = readParts(request);
+			}
 		}
 
 		// Loop through items
@@ -232,6 +245,27 @@ public class MultipartServletWebRequestImpl extends MultipartServletWebRequest
 		}
 	}
 
+	private List<FileItem> readParts(HttpServletRequest request) throws FileUploadException
+	{
+		List<FileItem> itemsFromParts = new ArrayList<>();
+		try
+		{
+			Collection<Part> parts = request.getParts();
+			if (parts != null)
+			{
+				for (Part part : parts)
+				{
+					FileItem fileItem = new PartFileItem(part);
+					itemsFromParts.add(fileItem);
+				}
+			}
+		} catch (IOException | ServletException e)
+		{
+			throw new FileUploadException("", e);
+		}
+		return itemsFromParts;
+	}
+
 	/**
 	 * Factory method for creating new instances of FileUploadBase
 	 *
@@ -530,4 +564,155 @@ public class MultipartServletWebRequestImpl extends MultipartServletWebRequest
 		Args.notNull(upload, "upload");
 		req.getSession().removeAttribute(getSessionKey(upload));
 	}
+
+	private static class PartFileItem implements FileItem
+	{
+		private final Part part;
+
+		private PartFileItem(Part part) {
+			this.part = part;
+		}
+
+		@Override
+		public InputStream getInputStream() throws IOException
+		{
+			return part.getInputStream();
+		}
+
+		@Override
+		public String getContentType()
+		{
+			return part.getContentType();
+		}
+
+		@Override
+		public String getName()
+		{
+			return getFileName(part);
+		}
+
+		private String getFileName(Part part) {
+			for (String cd : part.getHeader("content-disposition").split(";")) {
+				if (cd.trim().startsWith("filename")) {
+					return cd.substring(cd.indexOf('=') + 1).trim()
+							.replace("\"", "");
+				}
+			}
+			return null;
+		}
+
+		@Override
+		public boolean isInMemory()
+		{
+			return true;
+		}
+
+		@Override
+		public long getSize()
+		{
+			return part.getSize();
+		}
+
+		@Override
+		public byte[] get()
+		{
+			try
+			{
+				ByteArrayOutputStream baos = new ByteArrayOutputStream();
+				Streams.copy(getInputStream() ,baos);
+				return baos.toByteArray();
+			} catch (IOException iox)
+			{
+				throw new WicketRuntimeException("Could not read upload's part input stream", iox);
+			}
+		}
+
+		@Override
+		public String getString(String encoding) throws UnsupportedEncodingException
+		{
+			byte[] bytes = get();
+			return new String(bytes, encoding);
+		}
+
+		@Override
+		public String getString()
+		{
+			try
+			{
+				return getString("UTF-8");
+			} catch (UnsupportedEncodingException uex)
+			{
+				throw new WicketRuntimeException("UTF-8 must be supported", uex);
+			}
+		}
+
+		@Override
+		public void write(File file) throws Exception
+		{
+			part.write(file.getName());
+		}
+
+		@Override
+		public void delete()
+		{
+			try
+			{
+				part.delete();
+			} catch (IOException iox)
+			{
+				throw new WicketRuntimeException("A problem occurred while deleting an upload part", iox);
+			}
+		}
+
+		@Override
+		public String getFieldName()
+		{
+			return part.getName();
+		}
+
+		@Override
+		public void setFieldName(String name)
+		{
+			throw new UnsupportedOperationException("setFieldName");
+		}
+
+		@Override
+		public boolean isFormField()
+		{
+			return false;
+		}
+
+		@Override
+		public void setFormField(boolean state)
+		{
+			throw new UnsupportedOperationException("setFormField");
+		}
+
+		@Override
+		public OutputStream getOutputStream() throws IOException
+		{
+			throw new UnsupportedOperationException("getOutputStream");
+		}
+
+		@Override
+		public FileItemHeaders getHeaders()
+		{
+			FileItemHeadersImpl fileItemHeaders = new FileItemHeadersImpl();
+			for (String headerName : part.getHeaderNames())
+			{
+				Collection<String> headerValues = part.getHeaders(headerName);
+				for (String headerValue : headerValues)
+				{
+					fileItemHeaders.addHeader(headerName, headerValue);
+				}
+			}
+			return fileItemHeaders;
+		}
+
+		@Override
+		public void setHeaders(FileItemHeaders headers)
+		{
+			throw new UnsupportedOperationException("setHeaders");
+		}
+	}
 }