2013-10-20 41 views
4

我正在使用一個catch-all servlet並將請求對象傳遞給其他內部框架類。它是如何設計我的應用程序的。原因超出了這個問題的範圍。Java Servlets使用MultipartConfig

@WebServlet(name="RequestHandler", urlPatterns="/*") 

我試圖用做從瀏覽器文件上傳多形式的數據:

<form action="" method="POST" enctype="multipart/form-data"> 
    <input type="file" name="file"/> 
    <input type="submit" name="videoUpload" value="Upload"/> 
</form> 

而實際上沿着服務器傳遞文件數據的唯一辦法就是註釋的servlet搭配:

@MultipartConfig 

如果我詮釋我捕獲所有的servlet,一切工作正常,但它不是很經常的一切,我真的需要使用文件上傳功能。

選項1:保持獨立。 即使大多數請求不使用它,離開註釋是否會導致不必要的開銷?

選項2:以編程方式添加它? 如果檢測到multipart的表單類型,是否可以通過編程方式添加註釋?

選項3:在別處使用註釋。 如何在單獨的類中使用註釋(我假設它需要在請求對象實際創建之前存在...)?

回答

1

如果您不添加'@MultipartConfig'註釋就可以了。您可以編程方式確定;如果內容多與否:

String form_field=""; 
FileItem fileItem = null; 
if (ServletFileUpload.isMultipartContent(request)) { 
      ServletFileUpload servletFileUpload = new ServletFileUpload(new DiskFileItemFactory()); 
      try { 
       fileItemsList = servletFileUpload.parseRequest(request); 
      } catch (FileUploadException ex) { 
       out.print(ex); 
      } 
      String optionalFileName = ""; 
      Iterator it = fileItemsList.iterator(); 
      while (it.hasNext()) { 
       FileItem fileItemTemp = (FileItem) it.next(); 
       if (fileItemTemp.isFormField()) { 
        if (fileItemTemp.getFieldName().equals("form_field")) { 
         form_field = fileItemTemp.getString(); 
        } 
       } else { 
        if (fileItemTemp.getFieldName().equals("file")) { 
         fileItem = fileItemTemp; 
        } 
       } 
      } 
     } 

如果ServletFileUpload.isMultipartContent(要求)是假的,那麼你可以通過用request.getParameter檢索方式一般形式參數。在本例中我使用了apache file upload

+0

另一種選擇是使用過濾器來確定請求是否爲多部分,以避免混淆servlet並不得不重新發布代碼。我從@BalusC http://balusc.blogspot.com/2009/12/uploading-files-in-servlet-30.html找到了有用的資源 – ryandlf