2009-10-09 88 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访问这些字段的值,并插入到数据库中。