Partage
  • Partager sur Facebook
  • Partager sur Twitter

probleme servlet upload

un débutant en détresse !

    28 janvier 2015 à 1:25:16

    Bonjour à toutes et à tous.

    je suis complètement perdu :(

    Je suis actuellement le cour java jee et je suis au chapitre 26 : envoie de fichier.

    un message d'erreur survient lorsque je dois créer le fichier et écrire dans le fichier situé dans le dossier c:/fichier.

    L'étape qui consiste à lire et à récupérer le nom du fichier sélectionné  pour l'affiché marche :

    par contre lorsqu'il s'agit de créer le fichier et d'écrire dessus ca ne marche plus :

    voici le message d'erreur de tomcat 7 version 7.0.57 :

    janv. 28, 2015 1:20:21 AM org.apache.catalina.core.StandardWrapperValve invoke
    GRAVE: "Servlet.service()" pour la servlet Upload a généré une exception
    java.lang.NullPointerException
        at com.sdzee.servlets.Upload.ecrireFichier(Upload.java:108)
        at com.sdzee.servlets.Upload.doPost(Upload.java:53)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
        at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Unknown Source)

    et voici mon code du servlet upload :

    package com.sdzee.servlets;

    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;

    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.Part;

    import com.sdzee.beans.Utilisateur;
    import com.sdzee.forms.InscriptionForm;

    public class Upload  extends HttpServlet{
        private static final String VUE  = "/WEB-INF/upload.jsp";
        private static final String CHAMP_DESCRIPTION  = "description";
        private static final String CHAMP_FICHIER  = "fichier";
        private static final String CHEMIN  = "chemin";
        private static final int TAILLE_TAMPON  = 10240;// 10 ko
       
        public void doGet ( HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException
        {
                /*affichage de la page d'inscription*/
                this.getServletContext().getRequestDispatcher(VUE).forward(request, response);                   
        }
       
        public void doPost ( HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException
        {
                /*lecture du parametre chemin passe à la servlet via la declarationdans le web.xml*/
                String chemin = this.getServletConfig().getInitParameter(CHEMIN);
               
                /*récupération du contenu du champ de description*/
                String description = request.getParameter(CHAMP_DESCRIPTION);
                request.setAttribute(CHAMP_DESCRIPTION, description);
                   
                /*fichier envoyer = multipart. Donc utilise méthode getPArt() pour récupérer le contenue de la requete http */
                /*contenu de la requete http : content-disposition: form-data; name=fichier; filename=nom_du_fichier;ext */
                Part part = request.getPart(CHAMP_FICHIER);

                /* on détermine si le contenu est un champ (string) ou un fichier */
                String nomFichier = getNomFichier(part);
                   
                if(nomFichier != null && !nomFichier.isEmpty() )
                {
                    String nomChamp = part.getName();
                   
                    ecrireFichier(part, nomFichier, chemin);
                   
                    request.setAttribute(nomChamp, nomFichier);
                }
                   
                    this.getServletContext().getRequestDispatcher(VUE).forward(request, response);   
                   
        }
       
       
       
        /* analyse entete content disposition dans entete http. Vérifier si parametre filename existe */
        /* si oui alors le champ du formulaire et un fichier, sinon c'est un autre type de champs */
       
        private static String getNomFichier (Part part)
        {
            /* boucle de selection du parametre content disposition dans l'entete http*/
            for (String contentDisposition : part.getHeader("content-disposition").split(";") )
            {
                /* seletion de l'entete content diposition filename dedans*/
                if(contentDisposition.trim().startsWith("filename") )
                {
                    /* retourne uniquement le nom du fichier peciser dans l'entete*/
                    return contentDisposition.substring(contentDisposition.indexOf('=')+1 ) ;
                }
            }
           
            return null;
        }
       

        /* écrire le fichier sur le disque dans le repertoire et avec le nom*/
        private void ecrireFichier(Part part, String nomFichier, String chemin) throws IOException
        {
            /*prepare els flux*/
            BufferedInputStream entree = null;
            BufferedOutputStream sortie = null;
            try
            {
                /* ouvre les flux*/
                /* getInputStream : on recupere le flux d'entrer*/
                entree = new BufferedInputStream(part.getInputStream(), TAILLE_TAMPON);
                /* on creer le fichier avec le nom et l'emplacement*/
                sortie = new BufferedOutputStream(new FileOutputStream( new File(chemin + nomFichier) ), TAILLE_TAMPON );
                /* lit le fichier reçu et écrit sont contenu dans un fichier sur le disque*/
                byte[] tampon = new byte [TAILLE_TAMPON ];
                int longueur = entree.read(tampon) ;
                while(longueur > 0)
                {
                    sortie.write(tampon, 0, longueur);
                }
            }finally
            {
                try
                {
                    sortie.close();
                }catch (IOException ignore){
                }
                try
                {
                    entree.close();
                }catch (IOException ignore){
                }
            }
        }
       
       
       
       
    }

    Donc si j'ai bien compris le message d'erreur de tomcat : la méthode ecrireFichier contiendrait un argument en paramètre qui pointe sur rien du tout ?

    Merci de votre aide ! :)

    • Partager sur Facebook
    • Partager sur Twitter
      28 janvier 2015 à 1:30:00

      je mets également le code de la page upload.jsp et du fichier web.xml si ca peut aider :

      web.xml :

      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
       
            <jsp-config>
              <jsp-property-group>
                  <url-pattern>*.jsp</url-pattern>
                  <include-prelude>/WEB-INF/taglibs.jsp</include-prelude>
              </jsp-property-group>
          </jsp-config>
         

        <servlet>
            <servlet-name>Inscription</servlet-name>
            <servlet-class>com.sdzee.servlets.Inscription</servlet-class>

        </servlet>
       
        <servlet-mapping>
            <servlet-name>Inscription</servlet-name>
            <url-pattern>/restreint/inscription</url-pattern>
        </servlet-mapping>
       
        <servlet>
            <servlet-name>Connexion</servlet-name>
            <servlet-class>com.sdzee.servlets.Connexion</servlet-class>

        </servlet>
       
        <servlet-mapping>
            <servlet-name>Connexion</servlet-name>
            <url-pattern>/connexion</url-pattern>
        </servlet-mapping>

        <servlet>
            <servlet-name>Deconnexion</servlet-name>
            <servlet-class>com.sdzee.servlets.Deconnexion</servlet-class>

        </servlet>
       
        <servlet-mapping>
            <servlet-name>Deconnexion</servlet-name>
            <url-pattern>/deconnexion</url-pattern>
        </servlet-mapping>
       
        <servlet>
            <servlet-name>Upload</servlet-name>
            <servlet-class>com.sdzee.servlets.Upload</servlet-class>
            <init-param>
                <param-name>chemin</param-name>
                <param-value>/fichiers/</param-value>
            </init-param>
            <multipart-config>
                <location>c:/fichiers</location>
                <max-file-size>10485760</max-file-size> <!-- 10 mo -->
                <max-request-size>52428800</max-request-size> <!-- 5 x 10 mo -->
                <file-size-threshold>1048576</file-size-threshold> <!-- 1 mo -->
            </multipart-config>

        </servlet>
       
        <servlet-mapping>
            <servlet-name>Upload</servlet-name>
            <url-pattern>/upload</url-pattern>
        </servlet-mapping> 
       
        <filter>
            <filter-name>RestrictionFilter</filter-name>
           <filter-class>com.sdzee.filters.RestrictionFilter</filter-class>
        </filter>
       
        <filter-mapping>
            <filter-name>RestrictionFilter</filter-name>
            <url-pattern>/restreint/*</url-pattern>
        </filter-mapping>
       

       
      </web-app>

      et upload.jsp:

      <%@ page pageEncoding="UTF-8" %>
      <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
      <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
      <html>
          <head>
              <meta charset="utf-8">
          <title>envoie de fichier</title>
          <link type="text/css" rel="stylesheet" href="<c:url value="/inc/form.css"/>" />
          </head>
         
          <body>
              <form method="post" action="<c:url value="/upload" />" enctype="multipart/form-data">
                  <fieldset>
                      <legend>envoie de fichier</legend>
                      <p>Vous pouvez vous connecter via ce formulaire.</p>
       
                      <label for="description">Description du fichier </label>
                      <input type="text" id="description" name="description" value="" />
                      <span class="succes"><c:out value="${description }" /></span>
                      <br />
       
                      <label for="fichier">emplacement du fichier <span class="requis">*</span></label>
                      <input type="file" id="fichier" name="fichier" />
                      <span class="succes"><c:out value="${fichier }" /></span>
                      <br />
       
                      <input type="submit" value="envoyer" class="sansLabel" />
                      <br />
                      
                  </fieldset>
              </form>
          </body>
      </html>

      • Partager sur Facebook
      • Partager sur Twitter
        28 janvier 2015 à 3:08:52

        en continuant a chercher mon erreur j'ai cliquer sur cette ligne dans la console d'erreur :

        ca m'a afficher :

        et en cliquant sur

        ca m'a affiché :

        du coup je suis encore plus perdu....car je ne vois pas d'erreur dans mon concernant le flux de sortie :(

        • Partager sur Facebook
        • Partager sur Twitter
          28 janvier 2015 à 21:36:41

          alors je vais commencer par te dire un truc super important et tu es pas le seul à oublier ou a ne pas faire du tout dans tu affiche du code utilise la balise prévu c'est tellement illisible sans que l'on fait qu'une chose, survoler. elle est à droite de l'insertion d'image.

          et oui il pointe sur un emplacement nul, vide. Une astuce quand tu as un message d'erreur qui ressemble à une dissertation philosophique de FAC, corrige la première ligne ça supprime toujours 50 lignes d'erreurs en dessous ;)

          CE CODE EST LE MÊME QUE LE PREMIER POSTE (histoire de rende ça plus lisible pour tout le monde)

          package com.sdzee.servlets;
          
          import java.io.BufferedInputStream;
          import java.io.BufferedOutputStream;
          import java.io.File;
          import java.io.FileOutputStream;
          import java.io.IOException;
          
          import javax.servlet.ServletException;
          import javax.servlet.http.HttpServlet;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;
          import javax.servlet.http.Part;
          
          import com.sdzee.beans.Utilisateur;
          import com.sdzee.forms.InscriptionForm;
          
          public class Upload  extends HttpServlet{
              private static final String VUE  = "/WEB-INF/upload.jsp";
              private static final String CHAMP_DESCRIPTION  = "description";
              private static final String CHAMP_FICHIER  = "fichier";
              private static final String CHEMIN  = "chemin";
              private static final int TAILLE_TAMPON  = 10240;// 10 ko
             
              public void doGet ( HttpServletRequest request, HttpServletResponse response)
                      throws ServletException, IOException
              {
                      /*affichage de la page d'inscription*/
          
                      this.getServletContext().getRequestDispatcher(VUE).forward(request, response);                   
              }
             
              public void doPost ( HttpServletRequest request, HttpServletResponse response)
                      throws ServletException, IOException
              {
                      /*lecture du parametre chemin passe à la servlet via la declarationdans le web.xml*/
          
                      String chemin = this.getServletConfig().getInitParameter(CHEMIN);
                     
                      /*récupération du contenu du champ de description*/
          
                      String description = request.getParameter(CHAMP_DESCRIPTION);
                      request.setAttribute(CHAMP_DESCRIPTION, description);
                         
                      /*fichier envoyer = multipart. Donc utilise méthode getPArt() pour récupérer le contenue de la requete http */
                      /*contenu de la requete http : content-disposition: form-data; name=fichier; filename=nom_du_fichier;ext */
          
                      Part part = request.getPart(CHAMP_FICHIER);
          
                      /* on détermine si le contenu est un champ (string) ou un fichier */
          
                      String nomFichier = getNomFichier(part);
                         
                      if(nomFichier != null && !nomFichier.isEmpty() )
                      {
                          String nomChamp = part.getName();
                         
                          ecrireFichier(part, nomFichier, chemin);
                         
                          request.setAttribute(nomChamp, nomFichier);
                      }
                         
                          this.getServletContext().getRequestDispatcher(VUE).forward(request, response);   
                         
              }
             
             
             
              /* analyse entete content disposition dans entete http. Vérifier si parametre filename existe */
          
              /* si oui alors le champ du formulaire et un fichier, sinon c'est un autre type de champs */
             
              private static String getNomFichier (Part part)
              {
                  /* boucle de selection du parametre content disposition dans l'entete http*/
          
                  for (String contentDisposition : part.getHeader("content-disposition").split(";") )
                  {
                      /* seletion de l'entete content diposition filename dedans*/
          
                      if(contentDisposition.trim().startsWith("filename") )
                      {
                          /* retourne uniquement le nom du fichier peciser dans l'entete*/
          
                          return contentDisposition.substring(contentDisposition.indexOf('=')+1 ) ;
                      }
                  }
                 
                  return null;
              }
             
          
              /* écrire le fichier sur le disque dans le repertoire et avec le nom*/
          
              private void ecrireFichier(Part part, String nomFichier, String chemin) throws IOException
              {
                  /*prepare els flux*/
          
                  BufferedInputStream entree = null;
                  BufferedOutputStream sortie = null;
                  try
                  {
                      /* ouvre les flux*/
          
                      /* getInputStream : on recupere le flux d'entrer*/
          
                      entree = new BufferedInputStream(part.getInputStream(), TAILLE_TAMPON);
                      /* on creer le fichier avec le nom et l'emplacement*/
          
                      sortie = new BufferedOutputStream(new FileOutputStream( new File(chemin + nomFichier) ), TAILLE_TAMPON );
          
                      /* lit le fichier reçu et écrit sont contenu dans un fichier sur le disque*/
          
                      byte[] tampon = new byte [TAILLE_TAMPON ];
                      int longueur = entree.read(tampon) ;
                      while(longueur > 0)
                      {
                          sortie.write(tampon, 0, longueur);
                      }
                  }finally
                  {
                      try
                      {
                          sortie.close();
                      }catch (IOException ignore){
                      }
                      try
                      {
                          entree.close();
                      }catch (IOException ignore){
                      }
                  }
              }  
          }





          je finirais l'indentation a un autre moment

          -
          Edité par GuillaumeBo1 28 janvier 2015 à 21:55:34

          • Partager sur Facebook
          • Partager sur Twitter
          Un homme azerty en vaut deux.
            8 février 2015 à 21:23:00

            ha effectivement merci du conseil ^^
            • Partager sur Facebook
            • Partager sur Twitter

            probleme servlet upload

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown