2009-10-09 11 views
2

Je ne parviens pas à obtenir des valeurs à la fois des fichiers et de la saisie de texte dans une servlet lorsque mon formulaire inclut des données multipart/form. J'utilise apache.commons.fileuploads pour obtenir de l'aide sur les téléchargements. Aucune suggestion. Aussi dans le code ci-dessous il y a certaines choses que je pense devrait être plus efficace. Existe-t-il un meilleur moyen de stocker ces fichiers multiples dans un db.Problème avec 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); 

Répondre

0

J'ai eu des problèmes similaires dans le passé. La seule façon de contourner le problème était de mettre le fileupload dans sa propre forme.

+0

Oui, j'ai besoin que ce soit une forme si possible. Je crois que cela doit être quelque chose à faire avec la servlet car je peux publier les valeurs dans la chaîne url et elles semblent correctes mais le servlet saisit la valeur comme nulle – kbrin80

10

Lorsque vous utilisez multipart/form-data, les valeurs des champs d'entrée normaux sont pas disponibles par request.getParameter() car l'API standard Servlet avant la version 3.0 ne dispose pas d'installations pour les builtin analyser. C'est exactement pourquoi Apache Commons FileUpload existe. Vous devez vérifier si FileItem#isFormField() renvoie true, puis les rassembler à partir du FileItem.

À l'heure actuelle, vous ignorez ces valeurs dans le code. Certes, le FileItem est un nom trompeur, si c'était moi, je l'avais appelé MultipartItem ou juste Part représentant une partie d'un corps multipart/form-data qui contient à la fois des champs téléchargés et des paramètres normaux.

Voici un exemple de coup d'envoi comment vous devez analyser une demande multipart/form-data correctement:

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()); 
    }    
} 

Notez que vous surplombait un mauvais comportement MSIE qu'il envoie le chemin du côté client complet le long du nom de fichier. Vous souhaitez le couper hors du item.getName() selon la FileUpload FAQ:

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

J'utilise Struts 1.3 et ServletFileUpload (new DiskFileItemFactory()) .parseRequest (demande); renvoie null avec un formulaire multipart/form-data (http://stackoverflow.com/questions/18759688/java-servlet-issue-with-multipart-form-data-form). – Sefran2

+0

Vous devez utiliser le service de téléchargement de fichiers fourni par Struts. Lisez sa documentation. – BalusC

+0

Voulez-vous dire la classe FormFile? J'ai une forme dynamique codée au format json, donc je traite la requête "à la main". – Sefran2

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

c'est le code pour accéder à la valeur du champ de formulaire, mais si j'ai 2 champ 1 est le nom et l'autre est l'adresse

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

comment accéder à ces valeurs de champ séparemment et insérer dans la base de données.