1 package com.atlassian.plugins.rest.common.multipart.fileupload;
2
3 import java.util.ArrayList;
4 import java.util.Collection;
5
6 import javax.servlet.http.HttpServletRequest;
7
8 import com.atlassian.plugins.rest.common.multipart.FilePart;
9 import com.atlassian.plugins.rest.common.multipart.FileSizeLimitExceededException;
10 import com.atlassian.plugins.rest.common.multipart.MultipartForm;
11 import com.atlassian.plugins.rest.common.multipart.MultipartHandler;
12
13
14 import org.apache.commons.fileupload.FileItem;
15 import org.apache.commons.fileupload.FileUploadBase;
16 import org.apache.commons.fileupload.FileUploadException;
17 import org.apache.commons.fileupload.RequestContext;
18 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
19 import org.apache.commons.fileupload.servlet.ServletFileUpload;
20 import org.apache.commons.fileupload.servlet.ServletRequestContext;
21
22 public class CommonsFileUploadMultipartHandler implements MultipartHandler {
23 private final ServletFileUpload servletFileUpload;
24
25 public CommonsFileUploadMultipartHandler(long maxFileSize, long maxSize) {
26 servletFileUpload = new ServletFileUpload(new DiskFileItemFactory());
27 servletFileUpload.setFileSizeMax(maxFileSize);
28 servletFileUpload.setSizeMax(maxSize);
29 }
30
31 public FilePart getFilePart(HttpServletRequest request, String field) {
32 return getForm(request).getFilePart(field);
33 }
34
35 private static class CommonsFileUploadMultipartForm implements
36 MultipartForm {
37 private final Collection<FileItem> fileItems;
38
39 private CommonsFileUploadMultipartForm(
40 final Collection<FileItem> fileItems) {
41 this.fileItems = fileItems;
42 }
43
44 public FilePart getFilePart(String field) {
45 for (FileItem item : fileItems) {
46 if (item.getFieldName().equals(field)) {
47 return new CommonsFileUploadFilePart(item);
48 }
49 }
50 return null;
51 }
52
53 public Collection<FilePart> getFileParts(String field) {
54 Collection<FilePart> fileParts = new ArrayList<FilePart>();
55 for (FileItem item : fileItems) {
56 if (item.getFieldName().equals(field)) {
57 fileParts.add(new CommonsFileUploadFilePart(item));
58
59 }
60 }
61 return fileParts;
62 }
63 }
64
65 public MultipartForm getForm(HttpServletRequest request) {
66 return getForm(new ServletRequestContext(request));
67 }
68
69 public MultipartForm getForm(RequestContext request) {
70 try {
71 return new CommonsFileUploadMultipartForm(
72 servletFileUpload.parseRequest(request));
73 } catch (FileUploadException e) {
74 if (e instanceof FileUploadBase.FileSizeLimitExceededException
75 || e instanceof FileUploadBase.SizeLimitExceededException) {
76 throw new FileSizeLimitExceededException(e.getMessage());
77 }
78 throw new RuntimeException(e);
79 }
80 }
81 }