java.lang.NullPointerException : No FileItemFactory has been set 异常

标签 java servlets

在尝试使用流式 API 实现 fileUpload 时,我收到如下所述的错误: 正如我从 the Streaming API 收集到的“传统的 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)

最佳答案

new ServletFileUpload() 创建一个未初始化的实例。它的文档说:

Constructs an uninitialised instance of this class. A factory must be configured, using setFileItemFactory(), before attempting to parse requests.

因此您需要使用 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();
    ...
}

关于java.lang.NullPointerException : No FileItemFactory has been set 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2332563/

相关文章:

java - 如何在 spring security/thymeleaf 中自动生成 csrf token 而不使用 @EnableWebMvcSecurity

java - 如何重定向到servlet中的错误页面?

java - 无法从 Controller 包类访问 bean 包类

java - 更改小时和分钟后,日历 getTimeInMillis() 返回相同的值

java - Spring 安全 : how to get an authorized user in applicationContext. xml

java - ANTLR4语法: evaluation by listener/visitor or better with recursions?

PowerShell 无法识别 Java

java - 通过蓝牙在 Android 手机和运行 OS X 的笔记本电脑之间发送数据

java - 如何使用java邮件从收件箱中读取10天前的邮件?

tomcat - 将文件存储在 apache tomcat 服务器的 ROOT 目录中