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 <[email protected]> Authored: Fri Jun 26 14:40:33 2015 +0300 Committer: Martin Tzvetanov Grigorov <[email protected]> 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"); + } + } }
