Partage
  • Partager sur Facebook
  • Partager sur Twitter

Java Jee Upload d'un fichier

    9 avril 2022 à 4:44:42

    Bonjour

    Je suis sur le cours " Développez des sites web avec Java EE " exactement sur le partie ( Envoyer des fichiers )
    Et je me trouve après avoir effectué un copier coller et après avoir uploadé une photo de 500Ko avec l'erreur suivante :

    État HTTP 500 – Erreur interne du serveur


    Type Rapport d'exception

    message Cannot invoke "javax.servlet.http.Part.getHeader(String)" because "part" is null

    description Le serveur a rencontré une erreur interne qui l'a empêché de satisfaire la requête.

    exception

    java.lang.NullPointerException: Cannot invoke "javax.servlet.http.Part.getHeader(String)" because "part" is null
    	com.octest.servlets.UploadForm.getNomFichier(UploadForm.java:92)
    	com.octest.servlets.UploadForm.doPost(UploadForm.java:49)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:681)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
    	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    

    note La trace complète de la cause mère de cette erreur est disponible dans les fichiers journaux de ce serveur.



    Ma servlet :

    package com.octest.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.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.Part;
    
    
    /**
     * Servlet implementation class UploadForm
     */
    @WebServlet("/UploadForm")
    public class UploadForm extends HttpServlet {
        private static final long serialVersionUID = 1L;
        public static final int TAILLE_TAMPON = 10240;
        public static final String CHEMIN_FICHIERS = "/Users/user/eclipse-workspace/TestProject/users/files"; // A changer
     
        public UploadForm() {
            super();
            // TODO Auto-generated constructor stub
        }
    
        
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            //response.getWriter().append("Served at: ").append(request.getContextPath());
           
            this.getServletContext().getRequestDispatcher("/WEB-INF/uploadform.jsp").forward(request, response);
        }
    
        
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
               // On récupère le champ description comme d'habitude
            String description = request.getParameter("description");
            request.setAttribute("description", description );
    
            // On récupère le champ du fichier
            Part part = request.getPart("fichier");
                
            // On vérifie qu'on a bien reçu un fichier
            String nomFichier = getNomFichier(part);
    
            // Si on a bien un fichier
            if (nomFichier != null && !nomFichier.isEmpty()) {
                String nomChamp = part.getName();
                // Corrige un bug du fonctionnement d'Internet Explorer
                 nomFichier = nomFichier.substring(nomFichier.lastIndexOf('/') + 1)
                        .substring(nomFichier.lastIndexOf('\\') + 1);
    
                // On écrit définitivement le fichier sur le disque
                ecrireFichier(part, nomFichier, CHEMIN_FICHIERS);
    
                request.setAttribute(nomChamp, nomFichier);
            }
    
            this.getServletContext().getRequestDispatcher("/WEB-INF/uploadform.jsp").forward(request, response);
        }
        
        private void ecrireFichier( Part part, String nomFichier, String chemin ) throws IOException {
            BufferedInputStream entree = null;
            BufferedOutputStream sortie = null;
            try {
                entree = new BufferedInputStream(part.getInputStream(), TAILLE_TAMPON);
                sortie = new BufferedOutputStream(new FileOutputStream(new File(chemin + nomFichier)), TAILLE_TAMPON);
    
                byte[] tampon = new byte[TAILLE_TAMPON];
                int longueur;
                while ((longueur = entree.read(tampon)) > 0) {
                    sortie.write(tampon, 0, longueur);
                }
            } finally {
                try {
                    sortie.close();
                } catch (IOException ignore) {
                }
                try {
                    entree.close();
                } catch (IOException ignore) {
                }
            }
        }
        
        private static String getNomFichier( Part part ) {
            for ( String contentDisposition : part.getHeader( "content-disposition" ).split( ";" ) ) {
                if ( contentDisposition.trim().startsWith( "filename" ) ) {
                    return contentDisposition.substring( contentDisposition.indexOf( '=' ) + 1 ).trim().replace( "\"", "" );
                }
            }
            return null;
        }   
    
    }
    
    
    
    




    Ma JSP :

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Upload Form</title>
    </head>
    <body>
    <%@ include file="menu.jsp" %>
    <c:if test="${ !empty fichier }"><p><c:out value="Le fichier ${ fichier } (${ description }) a été uploadé !" /></p></c:if>
        <form method="post" action="UploadForm" enctype="multipart/form-data">
            <p>
                <label for="description">Description du fichier : </label>
                <input type="text" name="description" id="description" />
            </p>
            <p>
                <label for="fichier">Fichier à envoyer : </label>
                <input type="file" name="fichier" id="fichier" />
            </p>
            
            <input type="submit" />
        </form>
    
    </body>
    </html>
    
    
    



    My 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" version="3.0">
    
       <display-name>Upload</display-name>
        <welcome-file-list>
            <welcome-file>index.html</welcome-file>
            <welcome-file>index.htm</welcome-file>
            <welcome-file>index.jsp</welcome-file>
            <welcome-file>default.html</welcome-file>
            <welcome-file>default.htm</welcome-file>
            <welcome-file>default.jsp</welcome-file>
        </welcome-file-list>
        
      <servlet>
        <servlet-name>Test</servlet-name>
        <servlet-class>com.octest.servlets.Test</servlet-class>
      </servlet>
     
      <servlet-mapping>
        <servlet-name>Test</servlet-name>
        <url-pattern>/bonjour</url-pattern>
      </servlet-mapping>
     
       <servlet>
        <servlet-name>Accueil</servlet-name>
        <servlet-class>com.octest.servlets.Accueil</servlet-class>
      </servlet>
     
      <servlet-mapping>
        <servlet-name>Accueil</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>
     
      <servlet>
        <servlet-name>Form</servlet-name>
        <servlet-class>com.octest.servlets.Form</servlet-class>
      </servlet>
     
      <servlet-mapping>
        <servlet-name>Form</servlet-name>
        <url-pattern>/form</url-pattern>
      </servlet-mapping>
     
       <servlet>
        <servlet-name>Upload</servlet-name>
        <servlet-class>com.octest.servlets.UploadForm</servlet-class>
         <multipart-config>
                <location>/Users/user/eclipse-workspace/TestProject/users/filestmp</location> <!-- A adapter chez vous -->
                <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>/uploadform</url-pattern>
      </servlet-mapping>
     
         
         
    </web-app>

    Prière de m'aider sur ce sujet parce que j'arrive pas à comprendre pourquoi sur le tutorial ça passe sur la démonstration video du cours, et chez moi ça bloque

    Merci pour votre aide


    • Partager sur Facebook
    • Partager sur Twitter
      9 avril 2022 à 16:03:59

      bonjour,

      ta servlet( /UploadForm ) est bien associée au formulaire malheureusement elle ne prend  pas en compte le multipart/form-data du formulaire d'où l'erreur. Par contre la servlet répondant à l'url /uploadform, declarée dans le web.xml, prend bien en compte  le multipart/form-data du formulaire.C'est cette dernière qu'il faut associer à la servlet.

       remplace la ligne suivante du formulaire:

      <form method="post" action="UploadForm" enctype="multipart/form-data">


      par

      <form method="post" action="uploadform" enctype="multipart/form-data">



      -
      Edité par armel.mc 9 avril 2022 à 16:07:16

      • Partager sur Facebook
      • Partager sur Twitter
        9 avril 2022 à 16:15:22

        Bonjour armel.mc


        Merci bcp pour le retour et l'explication, j'ai fais comme tu m'as expliqué mais j'ai cette fois ci une autre erreur :



        État HTTP 404 – Non trouvé


        Type Rapport d'état

        message La ressource demandée [/TestProject/uploadform] n'est pas disponible

        description La ressource demandée n'est pas disponible.


        Apache Tomcat/8.5.78

        Le problème persiste toujours sur ce sujet
        • Partager sur Facebook
        • Partager sur Twitter
          9 avril 2022 à 18:32:09

          j'imagine que t'as redéployer l'application dans tomcat et que tu l'as redémarré ?

          normalement t'as déclaré dans le fichier web.xml (servlet-mapping ) que la servlet répond à l'url http://localhost:8080/TestProject/uploadform. du coup l'erreur 404 ne devrait pas avoir lieu.

          Sinon tu peux t'en passer de la déclaration de la servlet dans le web.xml et te contenter juste des annotations (mapping servlet et configuration multipart). Pour ce faire supprime le bloc suivant(servlet et servlet-mapping) dans le web.xml:

            
             <servlet>
              <servlet-name>Upload</servlet-name>
              <servlet-class>com.octest.servlets.UploadForm</servlet-class>
               <multipart-config>
                      <location>/Users/user/eclipse-workspace/TestProject/users/filestmp</location> <!-- A adapter chez vous -->
                      <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>/uploadform</url-pattern>
            </servlet-mapping>


          tu déportes la config de la servlet du web.xml vers la servlet UploadForm en utilisant les annotations:

          import javax.servlet.annotation.MultipartConfig;
          
          @WebServlet(urlPatterns = {"/UploadForm","/uploadform"})
          @MultipartConfig(
                  maxFileSize = 1024 * 1024 * 4,      // 4 MB
                  maxRequestSize = 1024 * 1024 * 4 ,  // 4 MB
                  fileSizeThreshold = 1024 * 1024 * 4 // 4 MB
          )
          public class UploadForm extends HttpServlet {
          
              
          // ...
          
          
          }

          Cette servlet répond à 2 urls: /uploadform ou /UploadForm.

          du coup au niveau de l'action du formulaire tu peux mettre action="uploadform" ou action="UploadForm"
          remplace le chemin suivant:

          public static final String CHEMIN_FICHIERS = "/Users/user/eclipse-workspace/TestProject/users/files"; // A changer

          par

          public static final String CHEMIN_FICHIERS = "/Users/user/eclipse-workspace/TestProject/users/files/"; // A changer



          Au passage dans une application Java EE moderne tu peux t'en passer du fichier web.xml et n'utiliser que les annotations

          -
          Edité par armel.mc 9 avril 2022 à 18:37:55

          • Partager sur Facebook
          • Partager sur Twitter
            9 avril 2022 à 18:50:21

            Re armel.mc

            j'imagine que t'as redéployer l'application dans tomcat et que tu l'as redémarré ?


            Oui effectivement je l'ai redémarré

            Quand j'ai appliqué le passage par annotations comme tu m'as indiqué , ça marche parfaitement sans aucune erreur

            Merci pour ton aide sur ce sujet, mais normalement d'après ton explication sans annotation devra marcher aussi avec le config Web.xml que j'ai

            Je sais pas le problème vient d'ou exactement

            Merci bcp pour ton aide et ton temps

            • Partager sur Facebook
            • Partager sur Twitter
              11 avril 2022 à 15:48:09

              bah de rien.

              est-ce que le fichier web.xml est bien dans le dossier WEB-INF?

              les autres patterns d'URL contenus dans le web.xml fonctionnent-ils ? par exemple le pattern d'URL /bonjour fait bien appel à la servlet Test?

              • Partager sur Facebook
              • Partager sur Twitter
                14 avril 2022 à 3:24:35

                Oui le fichier web.xml est dans le dossier WEB-INF
                et les autres patterns d'url fonctionnent sans aucun problème

                Oui la pattern /bonjour fait appel à la servlet Test

                • Partager sur Facebook
                • Partager sur Twitter
                  14 avril 2022 à 18:53:02

                  je viens de tester ton code en local, mapping de la servlet via web.wxl, ça  marche chez moi.

                  une autre hypothèse de l'erreur 404 c'est que la servlet com.octest.servlets.UploadForm ne se trouve pas dans le dossier src/main/java/com/octest/servlets/ (ou sr/com/octest/servlets/ ) : le nommage du package ne respecte sûrement pas les conventions.

                  Sinon essaies de partir d'un projet vierge avec l'IDE Eclipse en laissant ce dernier te générer le fichier web.xml.ensuite tu peux créer une servlet qui va interagir avec le formulaire.

                  -
                  Edité par armel.mc 14 avril 2022 à 18:54:18

                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 avril 2022 à 1:02:52

                    J'ai effectué comme demandé mais toujours la même chose le même échec
                    la com.octest.servlets.UploadForm se trouve sur le bon dossier src/main/java/com/octest/servlets/ comme tout
                    les autres servlets

                    tout les servlets fonctionne sans aucun problème à part celle de l'upload et j'arrive pas à comprendre sérieusement la cause exacte 

                    je n'utilise ni MAVEN ni GRADLE, est ce que c'est dû à ça ? je sais pas à force de ne pas comprendre la cause je commence à prétendre et soupçonné autre sujet !


                    -
                    Edité par KamProg 19 avril 2022 à 2:07:43

                    • Partager sur Facebook
                    • Partager sur Twitter
                      19 avril 2022 à 17:52:27

                      Maven comme Gradel n'est pas obligatoire pour créer une application Java EE.

                      L'erreur 404 signifie que la réssource demandée n'est pas disponilbe en l'occurence ici c'est l'URL qui ne matche pas avec la Servlet.

                      Sinon tu peux réinstaller eclipse en prenant une nouvelle version.

                      Je te laisse mes sources sur github .

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Java Jee Upload d'un fichier

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      • Editeur
                      • Markdown