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.MultipartHandler;
5   import com.google.common.base.Preconditions;
6   import org.apache.commons.fileupload.FileItem;
7   import org.apache.commons.fileupload.FileUploadException;
8   import org.apache.commons.fileupload.disk.DiskFileItemFactory;
9   import org.apache.commons.fileupload.servlet.ServletFileUpload;
10  
11  import javax.servlet.http.HttpServletRequest;
12  import java.io.IOException;
13  import java.io.InputStream;
14  import java.util.List;
15  
16  public class CommonsFileUploadMultipartHandler implements MultipartHandler
17  {
18      private final ServletFileUpload servletFileUpload;
19  
20      public CommonsFileUploadMultipartHandler(long maxFileSize)
21      {
22          servletFileUpload = new ServletFileUpload(new DiskFileItemFactory());
23          servletFileUpload.setFileSizeMax(maxFileSize);
24      }
25  
26      public FilePart getFilePart(HttpServletRequest request, String field)
27      {
28          if (!ServletFileUpload.isMultipartContent(request))
29          {
30              throw new RuntimeException("Not a multipart request");
31          }
32  
33          try
34          {
35              for (FileItem item : getFileItems(request))
36              {
37                  if (item.getFieldName().equals(field))
38                  {
39                      return new CommonsFileUploadFilePart(item);
40                  }
41              }
42              throw new RuntimeException("balsdjlas");
43          }
44          catch (FileUploadException e)
45          {
46              throw new RuntimeException(e);
47          }
48      }
49  
50      @SuppressWarnings("unchecked")
51      private List<FileItem> getFileItems(HttpServletRequest request) throws FileUploadException
52      {
53          return (List<FileItem>) servletFileUpload.parseRequest(request);
54      }
55  
56      private static class CommonsFileUploadFilePart implements FilePart
57      {
58          private final FileItem fileItem;
59  
60          CommonsFileUploadFilePart(FileItem fileItem)
61          {
62              this.fileItem = Preconditions.checkNotNull(fileItem);
63          }
64  
65          public String getName()
66          {
67              return fileItem.getName();
68          }
69  
70          public InputStream getInputStream() throws IOException
71          {
72              return fileItem.getInputStream();
73          }
74      }
75  }