2014-09-05 73 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