2015-10-20 32 views
-4

我想創建一個Servlet,它將接受一個簡單的POST請求。我按照here所描述的方法,並啓動了服務器,它用文字打出頁面你好朋友!如預期的那樣,Java Servlet的post請求不能與ServletFileUpload一起使用

所以接下來,我將doGet方法替換爲doPost,如here所述。這是我的代碼(大部分代碼被註釋掉):

package com.file.upload; 

import java.io.IOException; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import java.io.File; 
import java.util.Iterator; 
import java.util.List; 
import javax.activation.MimetypesFileTypeMap; 

import org.apache.commons.fileupload.FileItem; 
import org.apache.commons.fileupload.FileItemFactory; 
import org.apache.commons.fileupload.FileUploadException; 
import org.apache.commons.fileupload.disk.DiskFileItemFactory; 
import org.apache.commons.fileupload.servlet.ServletFileUpload; 
import org.apache.commons.io.FilenameUtils; 


/** 
* Servlet implementation class HelloServlet 
*/ 
@WebServlet("/Test") 
public class Test extends HttpServlet { 
    private static final long serialVersionUID = 1L; 
    private boolean isMultipart; 
    private String filePath; 
    private int maxFileSize = 50 * 1024; 
    private int maxMemSize = 4 * 1024; 
    private File file ; 

    public void init(){ 
     // Get the file location where it would be stored. 
     filePath = 
       getServletContext().getInitParameter("file-upload"); 
    } 

    public void doPost(HttpServletRequest request, 
      HttpServletResponse response) 
        throws ServletException, java.io.IOException { 
     // Check that we have a file upload request 
     isMultipart = ServletFileUpload.isMultipartContent(request); 
     response.setContentType("text/html"); 
     java.io.PrintWriter out = response.getWriter(); 
     if(!isMultipart){ 
      out.println("<html>"); 
      out.println("<head>"); 
      out.println("<title>Servlet upload</title>"); 
      out.println("</head>"); 
      out.println("<body>"); 
      out.println("<p>No file uploaded</p>"); 
      out.println("</body>"); 
      out.println("</html>"); 
      return; 
     } 
     boolean isMultipart = ServletFileUpload.isMultipartContent(request); 

     if (isMultipart) { 
      FileItemFactory factory = new DiskFileItemFactory(); 
      ServletFileUpload upload = new ServletFileUpload(factory); 

//   try { 
//    List items = upload.parseRequest(request); 
//    Iterator iterator = items.iterator(); 
//    while (iterator.hasNext()) { 
//     FileItem item = (FileItem) iterator.next(); 
//     if (!item.isFormField()) { 
//      String fileName = item.getName(); 
// 
//      String root = getServletContext().getRealPath("/"); 
//      File path = new File(root + "/fileuploads"); 
//      if (!path.exists()) { 
//       boolean status = path.mkdirs(); 
//      } 
// 
//      File uploadedFile = new File(path + "/" + fileName); 
//      item.write(uploadedFile); 
//     } 
//    } 
//   } catch(Exception ex) { 
//    System.out.println(ex); 
//   } 
     } 
    } 
} 

的代碼爲ServletFileUpload upload = new ServletFileUpload(factory);線失敗。這是錯誤堆棧我得到:

enter image description here

如何解決這個問題?

編輯:Eclipse中顯示錯誤日誌:

------ 
STATUS 
------ 
pluginId   org.eclipse.wst.server.core 
pluginVersion  1.6.100.v201505132000 
code    0 
severity   4 
message    HIDDEN 
fingerprint   d680f315 

Exception:org.eclipse.epp.internal.logging.aeri.ui.log.StandInStacktraceProvider$StandInException: HIDDEN 
    at org.eclipse.core.internal.jobs.JobManager.endJob(JobManager.java:701) 
    at org.eclipse.core.internal.jobs.WorkerPool.endJob(WorkerPool.java:105) 
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:72) 

------ 
REPORT 
------ 
anonymousId   5eca4a19-ce2d-4492-b01b-0011f98c45ff 
name    My Name 
email    
comment    
eclipseBuildId  4.5.0.I20150603-2000 
eclipseProduct  org.eclipse.epp.package.jee.product 
javaRuntimeVersion 1.8.0_51-b16 
osgiWs    cocoa 
osgiOs    MacOSX 
osgiOsVersion  10.10.5 
osgiArch   x86_64 
logMessage   false 
ignoreSimilar  false 

------- 
BUNDLES 
------- 
name    org.eclipse.core.jobs 
version    3.7.0.v20150330-2103 
+0

檢查頁面,如果這個問題是對您有用:http://stackoverflow.com/questions/32471642/multiple-file-upload/32472421 #32472421 –

+0

錯誤堆棧與到目前爲止發佈的代碼無關。 Tomcat剛啓動失敗(通常是由於嚴重的webapp配置錯誤)。它甚至沒有機會調用這個servlet。發佈完整的啓動日誌(請不要在截圖中,對searchbots不友好,只需將其發佈在代碼塊中)。 – BalusC

+0

你能告訴我在哪裏可以得到完整的啓動日誌嗎?我張貼的截圖?在它出現後立即消失(我以極高的時間精度截圖)... – SexyBeast

回答

3
  1. 你的servlet不是線程安全的。

    可以多次同時調用doPost()方法來爲多個傳入請求提供服務。 servlet類中不應該有依賴於請求數據的字段。

    在你的情況下,你有「isMultipart」既作爲一個領域,也作爲一個局部變量。不應該有這樣的領域。

  2. 閱讀Java Servlet specification。 Tomcat 8實現了Servlet 3.1。它的「3.2文件上傳」一章涵蓋了文件上傳API。

    使用Apache Commons Fileupload是可能的,但爲什麼打擾,如果有官方Servlet API用於此任務?

  3. 在關閉Tomcat期間,NullPointerException stacktrace與您的問題無關。

    您的測試servlet不在該堆棧跟蹤中。尤其是「代碼在ServletFileUpload upload = new ServletFileUpload(factory); line。」上失敗。「你的問題中的陳述沒有證據。其他事情正在發生。

    是的,我一個通過服務器選項卡,即窗口 - >視圖 - >服務器,這樣做的,然後單擊開始按鈕,然後在該控制檯日誌消失

    當Eclipse以前,立即顯示出來啓動Tomcat(以及任何其他Java應用程序),它會爲它打開一個控制檯視圖。

    如果你不能找到控制檯視圖屏幕上,你可以使用窗口>透視>復位透視重置窗口布局,然後手動打開它通過窗口>顯示視圖>控制檯。見Eclipse Workbench Tutorial(也可通過幫助菜單中提供本地)以及其對Console view

+0

代碼在ServletFileUpload上傳失敗= new ServletFileUpload(factory); 「 - 我說過,因爲如果我註釋掉那一行,服務器將按預期啓動。 – SexyBeast

+0

我的代碼適用於使用最新的Tomcat 8,commons-io-2.4.jar,commons-fileupload- 1.3.1.jar。在別的地方尋找問題,你還沒有提供實際的錯誤信息。 –

+0

沒有。 – SexyBeast