2016-07-30 71 views
0

我想通過拖放文件上傳功能擴展現有的應用程序。該應用程序建立在Jetty + Wicket上。 DropzoneJS似乎是一個好方法。 Dropzone提供所有前端工作,我只需將它連接到後端。多部分POST請求不包含上傳的文件

事實證明,說起來容易做起來難。首先,我用Wicket quickstart創建了一個測試應用程序。我加了懸浮窗的主頁:

<!DOCTYPE html> 
<html> 
    <head> 
     <script src="https://rawgit.com/enyo/dropzone/master/dist/dropzone.js"></script> 
     <link rel="stylesheet" href="https://rawgit.com/enyo/dropzone/master/dist/dropzone.css"> 
    </head> 
    <body> 
     <form action="/upload" class="dropzone"></form> 
    </body> 
</html> 

懸浮窗簡單地從它的資源庫包括在內。在服務器上,我安裝在/上傳資源參考:

public class FileUploadResourceReference extends ResourceReference 
{ 
    public FileUploadResourceReference(String name) 
    { 
     super(FileUploadResourceReference.class, name); 
    } 

    @Override 
    public IResource getResource() 
    { 
     return new FileUploadResource(); 
    } 
} 

FileUploadResource將處理文件上傳處理:

public class FileUploadResource extends AbstractResource 
{ 
    @Override 
    protected ResourceResponse newResourceResponse(Attributes attributes) 
    { 
     ServletWebRequest request = (ServletWebRequest) attributes.getRequest(); 

     try 
     { 
      MultipartServletWebRequest multipartRequest = request 
     .newMultipartWebRequest(Bytes.megabytes(100), "ignored"); 
      Map<String, List<FileItem>> files = multipartRequest.getFiles(); 

      List<FileItem> fileItems = files.get("file"); 
      for (FileItem fileItem : fileItems) 
      { 
       saveFile(fileItem); 
      } 
     } 
     catch (FileUploadException e) 
     { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    private void saveFile(FileItem fileItem) 
    { 
     // not implemented 
    } 
} 

現在,這裏的問題,在上傳文件時,懸浮窗發送POST請求我的http://localhost:8080/upload。該請求被識別爲多部分請求,但文件參數不存在。一個空指針異常拋出進入for循環:

java.lang.NullPointerException 
    at com.test.FileUploadResource.newResourceResponse(FileUploadResource.java:31) ~[classes/:?] 
    at org.apache.wicket.request.resource.AbstractResource.respond(AbstractResource.java:629) ~[wicket-core-7.4.0.jar:7.4.0] 
    at org.apache.wicket.request.handler.resource.ResourceRequestHandler.respond(ResourceRequestHandler.java:105) ~[wicket-core-7.4.0.jar:7.4.0] 
    at org.apache.wicket.request.handler.resource.ResourceReferenceRequestHandler.respond(ResourceReferenceRequestHandler.java:108) ~[wicket-core-7.4.0.jar:7.4.0] 

我想不通這裏發生了什麼。根據Dropzone網站,表單聲明應該沒問題。可能是Dropzone中的一個錯誤?似乎不太可能。某些拒絕多部分表單請求的Jetty配置參數?似乎極不可能,至少我從來沒有聽說過它。

你可以在GitHub找到我的測試應用程序的完整源代碼。

回答

相關問題