2010-02-25 75 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