Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre habitué
    Inscrit en
    juin 2005
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : juin 2005
    Messages : 417
    Points : 155
    Points
    155

    Par défaut Impossible de capturer IllegalStateException

    Bonjour

    J'essaie d'envoyer un fichier lourd depuis mon formulaire, c'est-à-dire un fichier qui dépasse définit dans mon web.xml mais le message d'erreur que j'ai prévu pour ça ne s'affiche pas dans ma page jsp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    private String validationImage( HttpServletRequest request, String chemin ) throws FormValidationException {
            /*
             * Récupération du contenu du champ image du formulaire. Il faut ici
             * utiliser la méthode getPart().
             */
            String nomFichier = null;
            InputStream contenuFichier = null;
            try {
                Part part = request.getPart( CHAMP_IMAGE );
     
     
                nomFichier = getNomFichier( part );
     
                /*
                 * Si la méthode getNomFichier() a renvoyé quelque chose, il s'agit
                 * donc d'un champ de type fichier (input type="file").
                 */
                if ( nomFichier != null && !nomFichier.isEmpty() ) {
                    /*
                     * Antibug pour Internet Explorer, qui transmet pour une raison
                     * mystique le chemin du fichier local à la machine du client...
                     * 
                     * Ex : C:/dossier/sous-dossier/fichier.ext
                     * 
                     * On doit donc faire en sorte de ne sélectionner que le nom et
                     * l'extension du fichier, et de se débarrasser du superflu.
                     */
                    nomFichier = nomFichier.substring( nomFichier.lastIndexOf( '/' ) + 1 )
                            .substring( nomFichier.lastIndexOf( '\\' ) + 1 );
     
                    /* Récupération du contenu du fichier */
                    contenuFichier = part.getInputStream();
     
                    /* Extraction du type MIME du fichier depuis l'InputStream */
                    MimeUtil.registerMimeDetector( "eu.medsea.mimeutil.detector.MagicMimeMimeDetector" );
                    Collection<?> mimeTypes = MimeUtil.getMimeTypes( contenuFichier );
     
                    /*
                     * Si le fichier est bien une image, alors son en-tête MIME
                     * commence par la chaîne "image"
                     */
                    if ( mimeTypes.toString().startsWith( "image" ) ) {
                        /* Écriture du fichier sur le disque */
                        ecrireFichier( contenuFichier, nomFichier, chemin );
                    } else {
                        throw new FormValidationException( "Le fichier envoyé doit être une image." );
                    }
                }
     
     
     
            } catch ( NullPointerException  e ) {
                /*
                 * Exception retournée si la taille des données dépasse les limites
                 * définies dans la section <multipart-config> de la déclaration de
                 * notre servlet d'upload dans le fichier web.xml
                 */
     
                throw new FormValidationException( "Le fichier ne doit pas être vide." );
            }
     
     
            catch ( IllegalStateException e ) {
                /*
                 * Exception retournée si la taille des données dépasse les limites
                 * définies dans la section <multipart-config> de la déclaration de
                 * notre servlet d'upload dans le fichier web.xml
                 */
                e.printStackTrace();
                throw new FormValidationException( "Le fichier envoyé ne doit pas dépasser 1Mo." );
            } catch ( IOException e ) {
                /*
                 * Exception retournée si une erreur au niveau des répertoires de
                 * stockage survient (répertoire inexistant, droits d'accès
                 * insuffisants, etc.)
                 */
                e.printStackTrace();
                throw new FormValidationException( "Erreur de configuration du serveur." );
            } catch ( ServletException e ) {
                /*
                 * Exception retournée si la requête n'est pas de type
                 * multipart/form-data.
                 */
                e.printStackTrace();
                throw new FormValidationException(
                        "Ce type de requête n'est pas supporté, merci d'utiliser le formulaire prévu pour envoyer votre fichier." );
            }
     
            return nomFichier;
        }
    J'arrive pourtant à voir l'exception dans mon netbeans grâce au e.printStackTrace():

    java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (431748586) exceeds the configured maximum (52428800)
    at org.apache.catalina.connector.Request.parseParts(Request.java:2804)
    at org.apache.catalina.connector.Request.parseParameters(Request.java:3073)
    at org.apache.catalina.connector.Request.getParameter(Request.java:1095)
    at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:380)
    at org.netbeans.modules.web.monitor.server.MonitorRequestWrapper.getParameter(MonitorRequestWrapper.java:199)
    at forms.CreationProduitForm.getValeurChamp(CreationProduitForm.java:255)
    at forms.CreationProduitForm.creerProduit(CreationProduitForm.java:54)
    at servlets.AjoutProduit.doPost(AjoutProduit.java:52)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:217)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)
    Caused by: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (431748586) exceeds the configured maximum (52428800)
    at org.apache.tomcat.util.http.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:811)
    at org.apache.tomcat.util.http.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:256)
    at org.apache.tomcat.util.http.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:280)
    at org.apache.catalina.connector.Request.parseParts(Request.java:2734)
    ... 33 more
    java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (431748586) exceeds the configured maximum (52428800)
    at org.apache.catalina.connector.Request.parseParts(Request.java:2804)
    at org.apache.catalina.connector.Request.parseParameters(Request.java:3073)
    at org.apache.catalina.connector.Request.getParameter(Request.java:1095)
    at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:380)
    at org.netbeans.modules.web.monitor.server.MonitorRequestWrapper.getParameter(MonitorRequestWrapper.java:199)
    at forms.CreationProduitForm.getValeurChamp(CreationProduitForm.java:255)
    at forms.CreationProduitForm.creerProduit(CreationProduitForm.java:54)
    at servlets.AjoutProduit.doPost(AjoutProduit.java:52)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:217)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)
    Caused by: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (431748586) exceeds the configured maximum (52428800)
    at org.apache.tomcat.util.http.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:811)
    at org.apache.tomcat.util.http.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:256)
    at org.apache.tomcat.util.http.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:280)
    at org.apache.catalina.connector.Request.parseParts(Request.java:2734)
    ... 33 more
    J'arrive aussi à afficher les messages d'erreur lorsque par exemple le champ est vide, ou lorsque le répertoire de destination est inexistant, mais pour le dépassement de taille de fichier, le message d'erreur "Le fichier envoyé ne doit pas dépasser 1Mo" ne s'affiche pas.

    Merci

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    juin 2018
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : juin 2018
    Messages : 53
    Points : 74
    Points
    74

    Par défaut

    Bonjour,

    En effet, l'erreur est bien produite lorsque vous tentez d'obtenir les Part de la demande en appelant HttpServletRequest.getParts () ou HttpServletRequest.getPart ().
    Mais au vu du message d'erreur, on dirait que celui-ci tourne en boucle.

    Dans votre fichier web.xml, avez-vous bien défini le max-file-size et le max-request-size ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <multipart-config>
        <location>/tmp</location>
        <max-file-size>20848820</max-file-size>
        <max-request-size>418018841</max-request-size>
        <file-size-threshold>1048576</file-size-threshold>
    </multipart-config>
    Je vais regarder avec une de mes applications.

    Bonne journée

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    juin 2018
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : juin 2018
    Messages : 53
    Points : 74
    Points
    74

    Par défaut

    Ou sinon, pouvez vous essayez ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
       private String validationImage(HttpServletRequest request, String chemin) throws FormValidationException {
            /*
             * Récupération du contenu du champ image du formulaire. Il faut ici
             * utiliser la méthode getPart().
             */
            String nomFichier = null;
            InputStream contenuFichier = null;
            Part part;
            try {
     
                part = request.getPart(CHAMP_IMAGE);
     
            } catch (IllegalStateException e) {
                /*
                 * Exception retournée si la taille des données dépasse les limites
                 * définies dans la section <multipart-config> de la déclaration de
                 * notre servlet d'upload dans le fichier web.xml
                 */
                e.printStackTrace();
                throw new FormValidationException("Le fichier envoyé ne doit pas dépasser 1Mo.");
     
            }catch (NullPointerException e) {
                /*
                 * Exception retournée si la taille des données dépasse les limites
                 * définies dans la section <multipart-config> de la déclaration de
                 * notre servlet d'upload dans le fichier web.xml
                 */
     
                throw new FormValidationException("Le fichier ne doit pas être vide.");
     
            }
     
            try {
     
                nomFichier = getNomFichier(part);
     
                /*
                 * Si la méthode getNomFichier() a renvoyé quelque chose, il s'agit
                 * donc d'un champ de type fichier (input type="file").
                 */
                if (nomFichier != null && !nomFichier.isEmpty()) {
                    /*
                     * Antibug pour Internet Explorer, qui transmet pour une raison
                     * mystique le chemin du fichier local à la machine du client...
                     * 
                     * Ex : C:/dossier/sous-dossier/fichier.ext
                     * 
                     * On doit donc faire en sorte de ne sélectionner que le nom et
                     * l'extension du fichier, et de se débarrasser du superflu.
                     */
                    nomFichier = nomFichier.substring(nomFichier.lastIndexOf('/') + 1)
                            .substring(nomFichier.lastIndexOf('\\') + 1);
     
                    /* Récupération du contenu du fichier */
                    contenuFichier = part.getInputStream();
     
                    /* Extraction du type MIME du fichier depuis l'InputStream */
                    MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector");
                    Collection<?> mimeTypes = MimeUtil.getMimeTypes(contenuFichier);
     
                    /*
                     * Si le fichier est bien une image, alors son en-tête MIME
                     * commence par la chaîne "image"
                     */
                    if (mimeTypes.toString().startsWith("image")) {
                        /* Écriture du fichier sur le disque */
                        ecrireFichier(contenuFichier, nomFichier, chemin);
                    } else {
                        throw new FormValidationException("Le fichier envoyé doit être une image.");
                    }
                }
     
            } catch (IOException e) {
                /*
                 * Exception retournée si une erreur au niveau des répertoires de
                 * stockage survient (répertoire inexistant, droits d'accès
                 * insuffisants, etc.)
                 */
                e.printStackTrace();
                throw new FormValidationException("Erreur de configuration du serveur.");
            } catch (ServletException e) {
                /*
                 * Exception retournée si la requête n'est pas de type
                 * multipart/form-data.
                 */
                e.printStackTrace();
                throw new FormValidationException(
                        "Ce type de requête n'est pas supporté, merci d'utiliser le formulaire prévu pour envoyer votre fichier.");
            }
     
            return nomFichier;
        }
    Bonne journée

  4. #4
    Membre habitué
    Inscrit en
    juin 2005
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : juin 2005
    Messages : 417
    Points : 155
    Points
    155

    Par défaut

    Citation Envoyé par Millezime Voir le message
    Ou sinon, pouvez vous essayez ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
       private String validationImage(HttpServletRequest request, String chemin) throws FormValidationException {
            /*
             * Récupération du contenu du champ image du formulaire. Il faut ici
             * utiliser la méthode getPart().
             */
            String nomFichier = null;
            InputStream contenuFichier = null;
            Part part;
            try {
     
                part = request.getPart(CHAMP_IMAGE);
     
            } catch (IllegalStateException e) {
                /*
                 * Exception retournée si la taille des données dépasse les limites
                 * définies dans la section <multipart-config> de la déclaration de
                 * notre servlet d'upload dans le fichier web.xml
                 */
                e.printStackTrace();
                throw new FormValidationException("Le fichier envoyé ne doit pas dépasser 1Mo.");
     
            }catch (NullPointerException e) {
                /*
                 * Exception retournée si la taille des données dépasse les limites
                 * définies dans la section <multipart-config> de la déclaration de
                 * notre servlet d'upload dans le fichier web.xml
                 */
     
                throw new FormValidationException("Le fichier ne doit pas être vide.");
     
            }
     
            try {
     
                nomFichier = getNomFichier(part);
     
                /*
                 * Si la méthode getNomFichier() a renvoyé quelque chose, il s'agit
                 * donc d'un champ de type fichier (input type="file").
                 */
                if (nomFichier != null && !nomFichier.isEmpty()) {
                    /*
                     * Antibug pour Internet Explorer, qui transmet pour une raison
                     * mystique le chemin du fichier local à la machine du client...
                     * 
                     * Ex : C:/dossier/sous-dossier/fichier.ext
                     * 
                     * On doit donc faire en sorte de ne sélectionner que le nom et
                     * l'extension du fichier, et de se débarrasser du superflu.
                     */
                    nomFichier = nomFichier.substring(nomFichier.lastIndexOf('/') + 1)
                            .substring(nomFichier.lastIndexOf('\\') + 1);
     
                    /* Récupération du contenu du fichier */
                    contenuFichier = part.getInputStream();
     
                    /* Extraction du type MIME du fichier depuis l'InputStream */
                    MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector");
                    Collection<?> mimeTypes = MimeUtil.getMimeTypes(contenuFichier);
     
                    /*
                     * Si le fichier est bien une image, alors son en-tête MIME
                     * commence par la chaîne "image"
                     */
                    if (mimeTypes.toString().startsWith("image")) {
                        /* Écriture du fichier sur le disque */
                        ecrireFichier(contenuFichier, nomFichier, chemin);
                    } else {
                        throw new FormValidationException("Le fichier envoyé doit être une image.");
                    }
                }
     
            } catch (IOException e) {
                /*
                 * Exception retournée si une erreur au niveau des répertoires de
                 * stockage survient (répertoire inexistant, droits d'accès
                 * insuffisants, etc.)
                 */
                e.printStackTrace();
                throw new FormValidationException("Erreur de configuration du serveur.");
            } catch (ServletException e) {
                /*
                 * Exception retournée si la requête n'est pas de type
                 * multipart/form-data.
                 */
                e.printStackTrace();
                throw new FormValidationException(
                        "Ce type de requête n'est pas supporté, merci d'utiliser le formulaire prévu pour envoyer votre fichier.");
            }
     
            return nomFichier;
        }
    Bonne journée
    J'ai essayé ça mais le problème est que les autres exceptions telles que NullPointerException, IOException, etc...ne s'affichent plus.

    Concernant le ichier web.xml, j'ai bien défini le max-file-size et le max-request-size:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     <servlet>
            <servlet-name>AjoutProduit</servlet-name>
            <servlet-class>servlets.AjoutProduit</servlet-class>
            <init-param>
                <param-name>chemin</param-name>
                <param-value>/fichiers/images/</param-value>
            </init-param>
            <multipart-config>
                <location>c:/fichiers/images</location>
                 <max-file-size>2097152</max-file-size> <!-- 2 Mo -->
                <max-request-size>10485760</max-request-size> <!-- 5 x 2Mo -->
                <file-size-threshold>1048576</file-size-threshold> <!-- 1 Mo -->
            </multipart-config>
        </servlet>

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    juin 2018
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : juin 2018
    Messages : 53
    Points : 74
    Points
    74

    Par défaut

    Bonjour,

    Je pense que votre problème provient d'une hiérarchie d’exception.
    Pouvez-vous essayez ce code ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    private String validationImage( HttpServletRequest request, String chemin ) throws FormValidationException {
            /*
             * Récupération du contenu du champ image du formulaire. Il faut ici
             * utiliser la méthode getPart().
             */
            String nomFichier = null;
            InputStream contenuFichier = null;
            try {
                Part part = request.getPart( CHAMP_IMAGE );
     
                if(part.getSize()==0){
                    /*
                     * Exception retournée si la taille des données dépasse les limites
                     * définies dans la section <multipart-config> de la déclaration de
                     * notre servlet d'upload dans le fichier web.xml
                     */
     
                    throw new FormValidationException( "Le fichier ne doit pas être vide." );
                }
     
                nomFichier = getNomFichier( part );
     
                /*
                 * Si la méthode getNomFichier() a renvoyé quelque chose, il s'agit
                 * donc d'un champ de type fichier (input type="file").
                 */
                if ( nomFichier != null && !nomFichier.isEmpty() ) {
                    /*
                     * Antibug pour Internet Explorer, qui transmet pour une raison
                     * mystique le chemin du fichier local à la machine du client...
                     * 
                     * Ex : C:/dossier/sous-dossier/fichier.ext
                     * 
                     * On doit donc faire en sorte de ne sélectionner que le nom et
                     * l'extension du fichier, et de se débarrasser du superflu.
                     */
                    nomFichier = nomFichier.substring( nomFichier.lastIndexOf( '/' ) + 1 )
                            .substring( nomFichier.lastIndexOf( '\\' ) + 1 );
     
                    /* Récupération du contenu du fichier */
                    contenuFichier = part.getInputStream();
     
                    /* Extraction du type MIME du fichier depuis l'InputStream */
                    MimeUtil.registerMimeDetector( "eu.medsea.mimeutil.detector.MagicMimeMimeDetector" );
                    Collection<?> mimeTypes = MimeUtil.getMimeTypes( contenuFichier );
     
                    /*
                     * Si le fichier est bien une image, alors son en-tête MIME
                     * commence par la chaîne "image"
                     */
                    if ( mimeTypes.toString().startsWith( "image" ) ) {
                        /* Écriture du fichier sur le disque */
                        ecrireFichier( contenuFichier, nomFichier, chemin );
                    } else {
                        throw new FormValidationException( "Le fichier envoyé doit être une image." );
                    }
                }
     
            }catch ( IllegalStateException e ) {
                /*
                 * Exception retournée si la taille des données dépasse les limites
                 * définies dans la section <multipart-config> de la déclaration de
                 * notre servlet d'upload dans le fichier web.xml
                 */
                e.printStackTrace();
                throw new FormValidationException( "Le fichier envoyé ne doit pas dépasser 1Mo." );
            } catch ( IOException e ) {
                /*
                 * Exception retournée si une erreur au niveau des répertoires de
                 * stockage survient (répertoire inexistant, droits d'accès
                 * insuffisants, etc.)
                 */
                e.printStackTrace();
                throw new FormValidationException( "Erreur de configuration du serveur." );
            } catch ( ServletException e ) {
                /*
                 * Exception retournée si la requête n'est pas de type
                 * multipart/form-data.
                 */
                e.printStackTrace();
                throw new FormValidationException(
                        "Ce type de requête n'est pas supporté, merci d'utiliser le formulaire prévu pour envoyer votre fichier." );
            }
     
            return nomFichier;
        }
    Sinon, à voir pour réaliser le traitement à l'aide plusieurs méthodes :
    • partEstVide()
    • validerTailleFichier()
    • chercherChemin()
    • ecrireFichier()

    Ainsi, les différents block catch seront séparés et devraient normalement s’exécuter.

    Tenez nous informé.

    Bonne journée

  6. #6
    Membre habitué
    Inscrit en
    juin 2005
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : juin 2005
    Messages : 417
    Points : 155
    Points
    155

    Par défaut

    Je viens de tester ce que tu m'as proposé mais ça ne marche pas toujours.

    Ensuite j'ai pas compris ce que tu veux dire ici:

    Sinon, à voir pour réaliser le traitement à l'aide plusieurs méthodes :

    partEstVide()
    validerTailleFichier()
    chercherChemin()
    ecrireFichier()
    Sinon j'ai changé de serveur, j'ai pris Glassfish 4.0 et bizarrement je n'ai pas la même exception:

    Avertissement: StandardWrapperValve[AjoutProduit]: Servlet.service() for servlet AjoutProduit threw exception
    java.lang.RuntimeException: Error in multipart initialization
    at org.apache.catalina.fileupload.Multipart.init(Multipart.java:99)
    at org.apache.catalina.connector.Request.processParameters(Request.java:1524)
    at org.apache.catalina.connector.Request.getParameter(Request.java:1545)
    at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:448)
    at forms.CreationProduitForm.getValeurChamp(CreationProduitForm.java:254)
    at forms.CreationProduitForm.creerProduit(CreationProduitForm.java:53)
    at servlets.AjoutProduit.doPost(AjoutProduit.java:52)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188)
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
    at java.lang.Thread.run(Thread.java:745)
    Caused by: javax.servlet.ServletException: the request was rejected because its size (431748586) exceeds the configured maximum (10485760)
    at org.apache.catalina.fileupload.RequestItemIterator.<init>(RequestItemIterator.java:306)
    at org.apache.catalina.fileupload.Multipart.initParts(Multipart.java:144)
    at org.apache.catalina.fileupload.Multipart.init(Multipart.java:97)
    ... 35 more
    Avec Apache tomcat 8.0.27.0 j'ai un IllegalStateException, mais avec Glassfish j'ai un java.lang.RuntimeException.

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    juin 2018
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : juin 2018
    Messages : 53
    Points : 74
    Points
    74

    Par défaut

    Bonjour,

    Pour ce qui est de réaliser le traitement à l'aide plusieurs méthodes, ce serait de gérer toutes les actions de récupération et d'écriture du fichier dans une même méthode, à voir pour gérer chaque action (vérifier si le fichier est vide, vérifier la taille du fichier, écrire le fichier...) dans des méthodes distinctes.

    Je vois pour vous envoyer comment je procède de mon côté en exemple.

    Bonne journée

  8. #8
    Membre habitué
    Inscrit en
    juin 2005
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : juin 2005
    Messages : 417
    Points : 155
    Points
    155

    Par défaut

    Finalement j'ai pu trouver la source du problème. Il s'agit de cette méthode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     /*
         * Méthode utilitaire qui retourne null si un champ est vide, et son contenu
         * sinon.
         */
        private static String getValeurChamp( HttpServletRequest request, String nomChamp ) {
            String valeur = request.getParameter( nomChamp );
            if ( valeur == null || valeur.trim().length() == 0 ) {
                return null;
            } else {
                return valeur;
            }
        }
    Je l'ai supprimée et j'arrive enfin à capturer l'exception IlleStateException et à afficher mon propre message d'erreur.

    Maintenant il s'agit de savoir pourquoi cette méthode ne fonctionne pas correctement. On dirait que le souci vient de la méthode getParameter.

    Est ce que la méthode request.getPart() gére aussi tous les autres types de données en dehors des fichiers? Si oui je vais remplacer request.getParameter() par request.getPart() pour voir ce que ça donne.

    Je vous tiens au courant.

    Merci

  9. #9
    Membre habitué
    Inscrit en
    juin 2005
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : juin 2005
    Messages : 417
    Points : 155
    Points
    155

    Par défaut

    En fait je me suis rendu qu'aucun des messages d'erreur contenus dans les try-catch ne s'affiche, pas même lorsque le fichier est vide. Finalement j'en suis toujours au même point, je n'arrive pas à capturer les messages d'erreur contenus dans le try-catch:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    private String validationImage( HttpServletRequest request, String chemin ) throws FormValidationException {
            /*
             * Récupération du contenu du champ image du formulaire. Il faut ici
             * utiliser la méthode getPart().
             */
            String nomFichier = null;
            InputStream contenuFichier = null;
            try {
                Part part = request.getPart( CHAMP_IMAGE );
     
     
                nomFichier = getNomFichier( part );
     
                /*
                 * Si la méthode getNomFichier() a renvoyé quelque chose, il s'agit
                 * donc d'un champ de type fichier (input type="file").
                 */
                if ( nomFichier != null && !nomFichier.isEmpty() ) {
                    /*
                     * Antibug pour Internet Explorer, qui transmet pour une raison
                     * mystique le chemin du fichier local à la machine du client...
                     * 
                     * Ex : C:/dossier/sous-dossier/fichier.ext
                     * 
                     * On doit donc faire en sorte de ne sélectionner que le nom et
                     * l'extension du fichier, et de se débarrasser du superflu.
                     */
                    nomFichier = nomFichier.substring( nomFichier.lastIndexOf( '/' ) + 1 )
                            .substring( nomFichier.lastIndexOf( '\\' ) + 1 );
     
                    /* Récupération du contenu du fichier */
                    contenuFichier = part.getInputStream();
     
                    /* Extraction du type MIME du fichier depuis l'InputStream */
                    MimeUtil.registerMimeDetector( "eu.medsea.mimeutil.detector.MagicMimeMimeDetector" );
                    Collection<?> mimeTypes = MimeUtil.getMimeTypes( contenuFichier );
     
                    /*
                     * Si le fichier est bien une image, alors son en-tête MIME
                     * commence par la chaîne "image"
                     */
                    if ( mimeTypes.toString().startsWith( "image" ) ) {
                        /* Écriture du fichier sur le disque */
                        ecrireFichier( contenuFichier, nomFichier, chemin );
                    } else {
                        throw new FormValidationException( "Le fichier envoyé doit être une image." );
                    }
                }
     
     
     
            } catch ( NullPointerException  e ) {
                /*
                 * Exception retournée si la taille des données dépasse les limites
                 * définies dans la section <multipart-config> de la déclaration de
                 * notre servlet d'upload dans le fichier web.xml
                 */
     
                throw new FormValidationException( "Le fichier ne doit pas être vide." );
            }
     
     
            catch ( IllegalStateException e ) {
                /*
                 * Exception retournée si la taille des données dépasse les limites
                 * définies dans la section <multipart-config> de la déclaration de
                 * notre servlet d'upload dans le fichier web.xml
                 */
                e.printStackTrace();
                throw new FormValidationException( "Le fichier envoyé ne doit pas dépasser 1Mo." );
            } catch ( IOException e ) {
                /*
                 * Exception retournée si une erreur au niveau des répertoires de
                 * stockage survient (répertoire inexistant, droits d'accès
                 * insuffisants, etc.)
                 */
                e.printStackTrace();
                throw new FormValidationException( "Erreur de configuration du serveur." );
            } catch ( ServletException e ) {
                /*
                 * Exception retournée si la requête n'est pas de type
                 * multipart/form-data.
                 */
                e.printStackTrace();
                throw new FormValidationException(
                        "Ce type de requête n'est pas supporté, merci d'utiliser le formulaire prévu pour envoyer votre fichier." );
            }
     
            return nomFichier;
        }

  10. #10
    Membre habitué
    Inscrit en
    juin 2005
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : juin 2005
    Messages : 417
    Points : 155
    Points
    155

    Par défaut

    Ok je viens de trouver d'où vient l'erreur mais je ne peux l'expliquer. Dans mon formulaire, j'ai 3 inputs de type champ de texte, liste déroulante et fichier et lorsque la taille du fichier dépasse la taille définie dans le web.xml, les valeurs des 2 autres champs (champ de texte et liste déroulante) sont considérées comme null, et je ne sais pas pourquoi. Or j'ai prévu un message d'erreur lorsque la valeur du champ de texte est vide:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private void validationAnnee( String annee ) throws FormValidationException {
            if ( annee == null  ) {
                throw new FormValidationException( "Veuillez entrer l'année." );
            } 
     
        }
    Mais pour la liste déroulante j'ai pas prévu de valeur null:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private void validationMois( String mois ) throws FormValidationException {
     
            if ( mois.equals("choix")  ) {
                throw new FormValidationException( "Merci de choisir le mois." );
            } 
        }
    Donc il s'agit de savoir pourquoi les valeurs des champs de mon formulaire sont remis à null lorsque la taille du fichier dépasse la taille autorisée dans le web.xml.

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/06/2014, 16h42
  2. capture flux video impossible
    Par mystercedric dans le forum Firefox
    Réponses: 1
    Dernier message: 09/08/2009, 20h37
  3. Réponses: 4
    Dernier message: 25/11/2008, 18h45
  4. Réponses: 1
    Dernier message: 15/10/2008, 23h27
  5. Réponses: 3
    Dernier message: 01/11/2002, 15h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo