View Javadoc

1   package com.atlassian.plugins.rest.common.multipart.fileupload;
2   
3   import com.atlassian.plugins.rest.common.multipart.FilePart;
4   import com.atlassian.plugins.rest.common.multipart.FileSizeLimitExceededException;
5   import com.atlassian.plugins.rest.common.multipart.MultipartForm;
6   import com.atlassian.plugins.rest.common.multipart.MultipartHandler;
7   import com.google.common.base.Preconditions;
8   import org.apache.commons.fileupload.FileItem;
9   import org.apache.commons.fileupload.FileUploadBase;
10  import org.apache.commons.fileupload.FileUploadException;
11  import org.apache.commons.fileupload.RequestContext;
12  import org.apache.commons.fileupload.disk.DiskFileItemFactory;
13  import org.apache.commons.fileupload.servlet.ServletFileUpload;
14  import org.apache.commons.fileupload.servlet.ServletRequestContext;
15  
16  import javax.servlet.http.HttpServletRequest;
17  import java.io.File;
18  import java.io.IOException;
19  import java.io.InputStream;
20  import java.util.ArrayList;
21  import java.util.Collection;
22  
23  public class CommonsFileUploadMultipartHandler implements MultipartHandler
24  {
25      private final ServletFileUpload servletFileUpload;
26  
27      public CommonsFileUploadMultipartHandler(long maxFileSize, long maxSize)
28      {
29          servletFileUpload = new ServletFileUpload(new DiskFileItemFactory());
30          servletFileUpload.setFileSizeMax(maxFileSize);
31          servletFileUpload.setSizeMax(maxSize);
32      }
33  
34      public FilePart getFilePart(HttpServletRequest request, String field)
35      {
36          return getForm(request).getFilePart(field);
37      }
38  
39      private static class CommonsFileUploadMultipartForm implements MultipartForm
40      {
41          private final Collection<FileItem> fileItems;
42  
43          private CommonsFileUploadMultipartForm(final Collection<FileItem> fileItems)
44          {
45              this.fileItems = fileItems;
46          }
47  
48          public FilePart getFilePart(String field)
49          {
50              for (FileItem item : fileItems)
51              {
52                  if (item.getFieldName().equals(field))
53                  {
54                      return new CommonsFileUploadFilePart(item);
55                  }
56              }
57              return null;
58          }
59  
60          public Collection<FilePart> getFileParts(String field)
61          {
62              Collection<FilePart> fileParts = new ArrayList<FilePart>();
63              for (FileItem item : fileItems)
64              {
65                  if (item.getFieldName().equals(field))
66                  {
67                      fileParts.add(new CommonsFileUploadFilePart(item));
68                  }
69              }
70              return fileParts;
71          }
72      }
73  
74      public MultipartForm getForm(HttpServletRequest request)
75      {
76          return getForm(new ServletRequestContext(request));
77      }
78  
79      @SuppressWarnings ("unchecked")
80      public MultipartForm getForm(RequestContext request)
81      {
82          try
83          {
84              return new CommonsFileUploadMultipartForm(servletFileUpload.parseRequest(request));
85          }
86          catch (FileUploadException e)
87          {
88              if (e instanceof FileUploadBase.FileSizeLimitExceededException || e instanceof FileUploadBase.SizeLimitExceededException)
89              {
90                  throw new FileSizeLimitExceededException(e.getMessage());
91              }
92              throw new RuntimeException(e);
93          }
94      }
95  
96      private static class CommonsFileUploadFilePart implements FilePart
97      {
98          private final FileItem fileItem;
99  
100         CommonsFileUploadFilePart(FileItem fileItem)
101         {
102             this.fileItem = Preconditions.checkNotNull(fileItem);
103         }
104 
105         public String getName()
106         {
107             return fileItem.getName();
108         }
109 
110         public InputStream getInputStream() throws IOException
111         {
112             return fileItem.getInputStream();
113         }
114 
115         public String getContentType()
116         {
117             return fileItem.getContentType();
118         }
119 
120         public void write(final File file) throws IOException
121         {
122             try
123             {
124                 fileItem.write(file);
125             }
126             catch (Exception e)
127             {
128                 if (e instanceof IOException)
129                 {
130                     throw (IOException) e;
131                 }
132                 else
133                 {
134                     // Change to IOException once we don't support Java 1.5 anymore
135                     throw new RuntimeException(e);
136                 }
137             }
138         }
139 
140         public String getValue()
141         {
142             return fileItem.getString();
143         }
144 
145         public boolean isFormField()
146         {
147             return fileItem.isFormField();
148         }
149     }
150 }