2010-02-25 25 views
2

在試圖使用流式API實現fileUpload時,我得到如下所述的錯誤: 當我從the Streaming API網頁收集「傳統FileItemFactory完全被忽略」時,我想知道我做錯了什麼。所以我決定的基本方法如下:java.lang.NullPointerException:沒有設置FileItemFactory

/** 
* 
* @param 
* @return 
*/ 
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { 

    // Check that we have a file upload request 
    boolean isMultipart = ServletFileUpload.isMultipartContent(request); 

    if (isMultipart) { 

     ServletFileUpload upload = new ServletFileUpload();     // Create a new file upload handler 

      // Parse the request 
      try { 
Line 39 -->   List items = upload.parseRequest(request);      // FileItem 
      Iterator iter = items.iterator(); 
      while (iter.hasNext()) { 
       FileItemStream item = (FileItemStream) iter.next(); 

       if (!item.isFormField()) { 
        this.processFITSFile(item); 
       } 
      } 
     } catch (FileUploadException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }  
    } 
} 

但是,這會導致下面的錯誤:

SEVERE: Servlet.service() for servlet FitsFileProcessorServlet threw exception 
java.lang.NullPointerException: No FileItemFactory has been set. 
    at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:353) 
    at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126) 
    at controller.FITSFileProcessor.doPost(FITSFileProcessor.java:39) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454) 
    at java.lang.Thread.run(Unknown Source) 
+0

你能標誌着你的代碼導致錯誤的行? (第39行,我猜) – 2010-02-25 08:23:31

+0

第39行應該是'List items = upload.parseRequest(request);' – romaintaz 2010-02-25 08:25:04

+0

是的,沒錯。編輯代碼 – Terman 2010-02-25 08:31:50

回答

8

new ServletFileUpload()創建一個未初始化的實例。其文檔說:

構造此類的未初始化實例 。在 試圖解析請求之前,工廠必須配置爲 ,使用 setFileItemFactory()。

因此,您需要使用setFileItemFactory()或使用其他構造函數,它將工廠作爲參數。像這樣:

// Create a factory for disk-based file items 
FileItemFactory factory = new DiskFileItemFactory(); 

// Create a new file upload handler 
ServletFileUpload upload = new ServletFileUpload(factory); 

有關更多信息,請參閱the documentation。這個例子也是從那裏開始的。

或者,你可以使用streaming API,但你需要獲得不同的迭代器:

ServletFileUpload upload = new ServletFileUpload(); 
FileItemIterator iter = upload.getItemIterator(request); 
while (iter.hasNext()) { 
    FileItemStream item = iter.next(); 
    ... 
} 
+0

但當時這樣做收益率: java.lang.ClassCastException:org.apache.commons.fileupload.disk.DiskFileItem不能轉換到org.apache.commons.fileupload.FileItemStream \t controller.FITSFileProcessor.doPost( FITSFileProcessor.java:46) \t javax.servlet.http.HttpServlet.service(HttpServlet.java:637) \t javax.servlet.http.HttpServlet.service(HttpServlet.java:717) – Terman 2010-02-25 08:35:58

+0

你需要做'上傳。 getItemIterator(request)'如果你想使用流API,請參閱http://commons.apache.org/fileupload/streaming.html – 2010-02-25 08:52:28

+0

@Yaw Reuben 我更新了我的答案,包括流媒體API – 2010-02-25 08:58:21