package org.sothis.mvc.http.servlet; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class CommonsUploadAttachments extends ServletAttachments { private final Map<String, Object> attachments; public CommonsUploadAttachments(HttpServletRequest request) throws IOException, ServletException { this.attachments = new HashMap<>(); try { DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); List<FileItem> items = upload.parseRequest(request); for (Iterator<FileItem> i = items.iterator(); i.hasNext();) { FileItem item = i.next(); List<ServletPart> parts = (List<ServletPart>) this.attachments.get(item.getFieldName()); if (null == parts) { parts = new ArrayList<ServletPart>(); this.attachments.put(item.getFieldName(), parts); } parts.add(new CommonsFileUploadPart(item)); } } catch (FileUploadException e) { throw new ServletException(e); } } @Override protected Map<String, Object> getAttachments() { return attachments; } private class CommonsFileUploadPart implements ServletPart { private final FileItem fileItem; public CommonsFileUploadPart(FileItem fileItem) { this.fileItem = fileItem; } @Override public InputStream getInputStream() throws IOException { return fileItem.getInputStream(); } @Override public String getContentType() { return fileItem.getContentType(); } @Override public String getName() { return fileItem.getFieldName(); } @Override public String getSubmittedFileName() { return fileItem.getName(); } @Override public long getSize() { return fileItem.getSize(); } @Override public void write(String fileName) throws IOException { try { fileItem.write(new File(fileName)); } catch (Exception e) { throw new IOException(e); } } @Override public void delete() throws IOException { fileItem.delete(); } @Override public String getHeader(String name) { return fileItem.getHeaders().getHeader(name); } @Override public Collection<String> getHeaders(String name) { List<String> headers = new ArrayList<>(); Iterator<String> i = fileItem.getHeaders().getHeaders(name); while (i.hasNext()) { headers.add(i.next()); } return headers; } @Override public Collection<String> getHeaderNames() { List<String> names = new ArrayList<>(); Iterator<String> i = fileItem.getHeaders().getHeaderNames(); while (i.hasNext()) { names.add(i.next()); } return names; } @Override public boolean isFormField() { return fileItem.isFormField(); } @Override public String getString(String charset) throws IOException { return fileItem.getString(charset); } } }