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 {
24 private final ServletFileUpload servletFileUpload;
25
26 public CommonsFileUploadMultipartHandler(long maxFileSize, long maxSize)
27 {
28 servletFileUpload = new ServletFileUpload(new DiskFileItemFactory());
29 servletFileUpload.setFileSizeMax(maxFileSize);
30 servletFileUpload.setSizeMax(maxSize);
31 }
32
33 public FilePart getFilePart(HttpServletRequest request, String field)
34 {
35 return getForm(request).getFilePart(field);
36 }
37
38 private static class CommonsFileUploadMultipartForm implements
39 MultipartForm
40 {
41 private final Collection<FileItem> fileItems;
42
43 private CommonsFileUploadMultipartForm(
44 final Collection<FileItem> fileItems)
45 {
46 this.fileItems = fileItems;
47 }
48
49 public FilePart getFilePart(String field)
50 {
51 for (FileItem item : fileItems)
52 {
53 if (item.getFieldName().equals(field))
54 {
55 return new CommonsFileUploadFilePart(item);
56 }
57 }
58 return null;
59 }
60
61 public Collection<FilePart> getFileParts(String field)
62 {
63 Collection<FilePart> fileParts = new ArrayList<FilePart>();
64 for (FileItem item : fileItems)
65 {
66 if (item.getFieldName().equals(field))
67 {
68 fileParts.add(new CommonsFileUploadFilePart(item));
69
70 }
71 }
72 return fileParts;
73 }
74 }
75
76 public MultipartForm getForm(HttpServletRequest request)
77 {
78 return getForm(new ServletRequestContext(request));
79 }
80
81 public MultipartForm getForm(RequestContext request)
82 {
83 try
84 {
85 return new CommonsFileUploadMultipartForm(
86 servletFileUpload.parseRequest(request));
87 }
88 catch (FileUploadException e)
89 {
90 if (e instanceof FileUploadBase.FileSizeLimitExceededException
91 || e instanceof FileUploadBase.SizeLimitExceededException)
92 {
93 throw new FileSizeLimitExceededException(e.getMessage());
94 }
95 throw new RuntimeException(e);
96 }
97 }
98 }