2014-09-05 61 views
2

我想上传一个文件,但我得到一个NullPointerException异常。零件空指针异常

我得到的错误是

SEVERE: java.lang.NullPointerException at servlet.UploadServlet.doPost(UploadServlet.java:36) 

在这条线:

InputStream is = part.getInputStream(); 

这里是Servlet和JSP页面的代码。

UploadServlet

@MultipartConfig(fileSizeThreshold = 1024 * 1024 * 10, maxFileSize = 1024 * 1024 * 50, maxRequestSize = 1024 * 1024 * 50) 

public class UploadServlet extends HttpServlet { 

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     response.setContentType("text/html;charset=UTF-8"); 
     PrintWriter out = response.getWriter(); 
     try { 

      Part part = request.getPart("file"); 
      InputStream is = part.getInputStream(); 

      String filename = getFileName(part); 
      String relativeWebPath = "/WEB-INF/uploads"; 
      String absoluteFilePath = getServletContext().getRealPath(relativeWebPath); 
      File uploadedFile = new File(absoluteFilePath, filename); 

      FileOutputStream os = new FileOutputStream(uploadedFile); 

      int i = is.read(); 
      while (i != -1) { 
       os.write(i); 
       i = is.read(); 
      } 
      os.close(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } finally { 
      out.close(); 
     } 
    } 

    private String getFileName(Part part) { 
     for (String cd : part.getHeader("content-disposition").split(";")) { 
      if (cd.trim().startsWith("filename")) { 
       String filename = cd.substring(cd.indexOf('=') + 1).trim().replace("\"", ""); 
       return filename.substring(filename.lastIndexOf('/') + 1).substring(filename.lastIndexOf('\\') + 1); 
      } 
     } 
     return null; 
    } 
} 

upload.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <link rel="stylesheet" type="text/css" href="css/style.css"> 
     <title>MobMel::Upload</title> 
    </head> 
    <body> 
     <form action="UploadServlet" method="post" enctype="multipart/form-data"> 
      <table class="upload"> 
       <tr> 
        <td>File</td> 
        <td><input type="file" name="file"></td> 
       </tr> 
       <tr> 
        <td></td> 
        <td><input type="submit" value="Upload"></td> 
       </tr> 
      </table> 
     </form> 
    </body> 
</html> 

的web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"> 
    <servlet> 
     <servlet-name>RegisterServlet</servlet-name> 
     <servlet-class>servlet.RegisterServlet</servlet-class> 
    </servlet> 
    <servlet> 
     <servlet-name>LoginServlet</servlet-name> 
     <servlet-class>servlet.LoginServlet</servlet-class> 
    </servlet> 
    <servlet> 
     <servlet-name>ProfileServlet</servlet-name> 
     <servlet-class>servlet.ProfileServlet</servlet-class> 
    </servlet> 
    <servlet> 
     <servlet-name>UploadServlet</servlet-name> 
     <servlet-class>servlet.UploadServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>RegisterServlet</servlet-name> 
     <url-pattern>/RegisterServlet</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>LoginServlet</servlet-name> 
     <url-pattern>/LoginServlet</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>ProfileServlet</servlet-name> 
     <url-pattern>/ProfileServlet</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>UploadServlet</servlet-name> 
     <url-pattern>/UploadServlet</url-pattern> 
    </servlet-mapping> 
    <session-config> 
     <session-timeout> 
      30 
     </session-timeout> 
    </session-config> 
</web-app> 

我希望你们能HEL我解决这个问题。

感谢

+2

你确定'request.getPart(“file”);'返回的是null以外的内容吗?你可以在你的代码中添加一行来检查它吗? – csmckelvey 2014-09-05 16:16:34

+0

当我使用part.getName()它返回“文件”,当我使用toString()它返回一些长字符串。 – 2014-09-05 16:30:58

+0

如果您在未选择文件的情况下提交表单,getPart将返回null,因此无论如何您都需要处理此用户错误。 – 2014-09-05 16:31:04

回答

0

我想这可能帮助: https://coderanch.com/t/618813/Null-Pointer-Exception-request-getPart 总之,你需要添加Multipartsconfig注解。至少在我的情况下,这种情况已经消失了。

+1

为什么简单_我可以通过一切手段提供更完整的解释,做到这一点! – 2017-07-25 15:33:23

+0

这个@multipartsconfig注释配置我们的servlet期望多部分/表单数据MIME类型请求。请参阅:http://docs.oracle.com/javaee/6/tutorial/doc/glrbb.html – 2017-07-26 15:25:24