2009-10-09 87 views
2

當我的表單包含multipart/form-data時,我無法從servlet中的文件和文本輸入中獲取值。我正在使用apache.commons.fileuploads獲取上傳幫助。有什麼建議麼。在下面的代碼中,還有一些我覺得應該更高效的東西。有沒有更好的方法來將這些多個文件存儲在數據庫中。multipart/form-data問題

public void performTask(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) 
    { 
     boolean promo = false; 
     Database db = new Database(); 
     Homepage hp = db.getHomePageContents(); 

     String part = ParamUtils.getStringParameter(request, "part", ""); 
     if(part.equals("verbage")) 
     { 
      String txtcontent = (String)request.getParameter("txtcontent"); 
      String promoheader = (String)request.getParameter("promoheader"); 
      String promosubheader = (String)request.getParameter("promosubheader"); 
      hp.setBodyText(txtcontent); 
      hp.setPromoHeader(promoheader); 
      hp.setPromoSubHeader(promosubheader); 
      System.err.println(txtcontent); 
     } 
     else 
     { 

      boolean isMultipart = ServletFileUpload.isMultipartContent(request); 
      if (!isMultipart) 
      { 

      } 
      else { 
       FileItemFactory factory = new DiskFileItemFactory(); 
       ServletFileUpload upload = new ServletFileUpload(factory); 
       List items = null; 
       try { 
       items = upload.parseRequest(request); 
       //System.err.print(items); 
       } catch (FileUploadException e) { 
       e.printStackTrace(); 
       } 

       Iterator itr = items.iterator(); 
       while (itr.hasNext()) { 
        FileItem item = (FileItem) itr.next(); 
        if(item.getFieldName().equals("mainimg1")) 
        { 
         if(item.getName() !="") hp.setMainImg1(item.getName()); 
        } 
        if(item.getFieldName().equals("mainimg2")) 
        { 
         if(item.getName() !="") hp.setMainImg2(item.getName()); 
        } 
        if(item.getFieldName().equals("mainimg3")) 
        { 
         if(item.getName() !="") hp.setMainImg3(item.getName()); 
        } 
        if(item.getFieldName().equals("promoimg1")) 
        { 
         promo = true; 
         if(item.getName() !="") 
         { 
          hp.setPromoImg1(item.getName()); 
          try { 
           File savedFile = new File("/Library/resin-4.0.1/webapps/ROOT/images/promoImg1.jpg"); 
           item.write(savedFile); 
           //System.err.print(items); 
          } catch (Exception e) { 
            System.err.println(e.getMessage()); 
          } 
         } 
        } 
        if(item.getFieldName().equals("promoimg2")) 
        { 
         if(item.getName() !="") 
         { 
          hp.setPromoImg2(item.getName()); 
          try { 
           File savedFile = new File("/Library/resin-4.0.1/webapps/ROOT/images/promoImg2.jpg"); 
           item.write(savedFile); 
           //System.err.print(items); 
          } catch (Exception e) { 
            System.err.println(e.getMessage()); 
          } 
         } 
        } 
        if(item.getFieldName().equals("promoimg3")) 
        { 
         if(item.getName() !="") 
         { 
          hp.setPromoImg3(item.getName()); 
          try { 
           File savedFile = new File("/Library/resin-4.0.1/webapps/ROOT/images/promoImg3.jpg"); 
           item.write(savedFile); 
           //System.err.print(items); 
          } catch (Exception e) { 
            System.err.println(e.getMessage()); 
          } 
         } 
        } 


        System.err.println("FNAME =" + item.getFieldName() + " : " + item.getName()); 
        if (item.isFormField()) { 
        } 
        else { 
         try { 
          if(!promo) 
          { 
           String itemName = item.getName(); 
           File savedFile = new File("/Library/resin-4.0.1/webapps/ROOT/images/"+itemName); 
           item.write(savedFile); 
          } 
          //System.err.print(items); 
         } catch (Exception e) { 
           System.err.println(e.getMessage()); 
          } 
        } 
       } 
      } 
     } 


     db.updateHomePageContent(hp); 

回答

0

我以前也有類似的問題。我可以找到問題的唯一方法是將fileupload放入它自己的形式。

+0

是的,如果可能的話,我需要這是1形式。我相信它必須與servlet有關,因爲我可以將值發佈到url字符串,並且它們看起來正確,但是servlet抓取的值爲空 – kbrin80 2009-10-12 14:25:40

10

當使用multipart/form-data,正常輸入字段值可通過request.getParameter()因爲之前的3.0版本的標準Servlet API中不具有內置設施,分析它們。這正是Apache Commons FileUpload存在的原因。您需要檢查FileItem#isFormField()是否返回true,然後從FileItem收集它們。

現在你忽略了代碼中的這些值。無可否認,FileItem是一個誤導性的名稱,如果是我的話,我稱它爲MultipartItem或者Part代表multipart/form-data正文的一部分,它包含上傳字段和正常參數。

這裏有一個開球例如,你應該如何正確地解析multipart/form-data要求:

List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request); 
for (FileItem item : items) { 
    if (item.isFormField()) { 
     // Process normal fields here. 
     System.out.println("Field name: " + item.getFieldName()); 
     System.out.println("Field value: " + item.getString()); 
    } else { 
     // Process <input type="file"> here. 
     System.out.println("Field name: " + item.getFieldName()); 
     System.out.println("Field value (file name): " + item.getName()); 
    }    
} 

請注意,還忽視了一個MSIE不當行爲,並將其發送沿文件名客戶端的路徑。你想從item.getName()修剪它作爲每FileUpload FAQ

String fileName = item.getName(); 
if (fileName != null) { 
    filename = FilenameUtils.getName(filename); 
} 
+0

我正在使用Struts 1.3和ServletFileUpload(new DiskFileItemFactory()) .parseRequest(請求);用multipart/form-data表單返回null(http://stackoverflow.com/questions/18759688/java-servlet-issue-with-multipart-form-data-form)。 – Sefran2 2013-09-12 09:25:58

+0

您應該使用Struts提供的文件上傳功能。閱讀其文檔。 – BalusC 2013-09-12 10:12:41

+0

你的意思是FormFile類嗎?我有一個以json格式編碼的動態表單,所以我「親手處理」請求。 – Sefran2 2013-09-12 11:30:10

1
if (item.isFormField()) { 
    // Process normal fields here. 
    System.out.println("Field name: " + item.getFieldName()); 
    System.out.println("Field value: " + item.getString());' 
} 

這是訪問表單字段值的代碼,但如果我有2場 1名,另一種是地址

<input type="text" name=name> 
<input type="text" name=address> 

如何separatly訪問這些字段的值,並插入到數據庫中。