IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Servlets/JSP Java Discussion :

Erreur "eu.medsea.mimeutil.MimeException: InputStream must support the mark()"


Sujet :

Servlets/JSP Java

  1. #1
    Membre actif
    Inscrit en
    Juin 2005
    Messages
    578
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 578
    Points : 240
    Points
    240
    Par défaut Erreur "eu.medsea.mimeutil.MimeException: InputStream must support the mark()"
    Bonjour

    J'essaie à partir de mon formulaire de récupérer une image et de l'insérer dans ma Base de données Mysql. Tout marche bien sauf que lors de l'insertion de certaines images, j'ai le message suivant:

    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
    févr. 18, 2015 12:53:15 PM org.apache.catalina.core.StandardWrapperValve invoke
    Grave: "Servlet.service()" pour la servlet AjouterPhoto a généré une exception
    eu.medsea.mimeutil.MimeException: InputStream must support the mark() and reset() methods.
        at eu.medsea.mimeutil.MimeUtil2.getMimeTypes(MimeUtil2.java:495)
        at eu.medsea.mimeutil.MimeUtil2.getMimeTypes(MimeUtil2.java:472)
        at eu.medsea.mimeutil.MimeUtil.getMimeTypes(MimeUtil.java:313)
        at forms.AjouterPhotoForm.validationPhoto(AjouterPhotoForm.java:117)
        at forms.AjouterPhotoForm.traiterPhoto(AjouterPhotoForm.java:78)
        at forms.AjouterPhotoForm.creerCandidat(AjouterPhotoForm.java:54)
        at servlets.AjouterPhoto.doPost(AjouterPhoto.java:50)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at filters.PrechargementFilter.doFilter(PrechargementFilter.java:66)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
        at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:744)
    Voici par exemple les caractéristiques d'un fichier qui met génère cette erreur:

    Type du fichier: Image JPEG (.JPG)

    Taille: 1,91 Mo (2 006 415 octets)

    Sur disque: 1,91 Mo (2 007 040 octets)

    Pourtant j'ai essayé d'insérer un autre fichier de 5 Mo , et j'ai eu le message qui me dit: Le fichier envoyé ne doit pas dépasser 2Mo.

    Donc je ne comprends pas pourquoi certains fichiers me renvoient des messages d'erreurs.

    Voici mon fichier xml:

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
     
    <servlet>
            <servlet-name>Image</servlet-name>
            <servlet-class>servlets.Image</servlet-class>
            <init-param>
                <param-name>chemin</param-name>
                <param-value>/fichiers/images/</param-value>
            </init-param>
        </servlet>
     
    <servlet>
            <servlet-name>AjouterPhoto</servlet-name>
            <servlet-class>servlets.AjouterPhoto</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>
     
    <servlet-mapping>
            <servlet-name>Image</servlet-name>
            <url-pattern>/images/*</url-pattern>
        </servlet-mapping>
     
     <servlet-mapping>
            <servlet-name>AjouterPhoto</servlet-name>
            <url-pattern>/ajouterPhoto</url-pattern>
        </servlet-mapping>
     
    </web-app>
    Merci

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    C'est probablement parce que tu n'intercales pas de BufferedInputStream : tous les InputStream ne supportent pas les marks, visiblement nécessaires pour cette méthode qui cause l'exception. Le fait d'intercaler un BufferedInputStream va permettre d'ajouter cette fonctionnalité à n'importe quel InputStream, mais en plus, ça va grandement améliorer les performances de ta servlet, au niveau uploading.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Salut,

    je remarque que l'erreur vient d'une méthode "getMimeType()" de l'API MimeUtil2 qui, me semble t'il est une API vieillissante.

    Personnellement pour récupérer le MimeType d'un fichier j'utilise getServletContext().getMimeType( nomDuFichier ) qui marche très bien et ne requiert aucune API tierce. De plus, si il te manque des extensions, tu peux les rajouter dans le fichier web.xml de ton application.

    Petit question pour @joel.drigo,
    mais en plus, ça va grandement améliorer les performances de ta servlet, au niveau uploading
    Peux tu expliciter un peu plus ?

    Je croyais que ça n'apportais rien en terme de performance de wrapper un InputStream dans un BufferedInputStream si on ne faisait que lire le stream en entier (car j'imagine que c'est ce qui est fait ici).

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Nico02 Voir le message
    Petit question pour @joel.drigo,

    Peux tu expliciter un peu plus ?

    Je croyais que ça n'apportais rien en terme de performance de wrapper un InputStream dans un BufferedInputStream si on ne faisait que lire le stream en entier (car j'imagine que c'est ce qui est fait ici).
    Ma remarque était plutôt d'ordre généraliste en fait, pour éviter d'entrer dans les détails. Ce n'est pas tant le fait de lire directement un InputStream pour l'écrire directement dans un OutputStream qui rend inutile le BufferedInputStream, mais c'est le fait de le faire octet par octet. En particulier, lors d'écriture dans des fichiers, à cause des accès systèmes. Je parle d'expérience à l'usage plus que de théorie, mais je veux bien qu'on me donne des contre-exemples.

    Un article intéressant sur le sujet ici.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Merci de la précision.

    Un autre lien intéressant ici

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Nico02 Voir le message
    Merci de la précision.

    Un autre lien intéressant ici
    Très intéressant, en effet.
    Manque plus qu'une comparaison par environnement/file système (genre les mêmes graphes, et comparés, pour NTFS).

    Après, je suppose qu'il faut se méfier de comparer des transferts de fichiers avec des transferts de "streams", via un client, via un réseau, un serveur, etc, qui ajoute sa couche. Tojours tenir compte du contexte. Je me souviens d'un cas de transfert de fichier (je ne sais plus quelle taille, mais assez volumineux) de Eclipse RCP à serveur tomcat, via http qui prenait 30 minutes de Macintosh à serveur Windows contre 30 secondes de Windows à serveur Windows, pour le même fichier, cela ça va sans dire. En utilisant un buffer de 4K, 30 minutes pour Mac, contre 12 secondes sur Windows. Bizarre non ? En fait ça venait simplement de la barre de progression (SWT), dont il fallait juste forker le rafraîchissement sur macintosh.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre actif
    Inscrit en
    Juin 2005
    Messages
    578
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 578
    Points : 240
    Points
    240
    Par défaut
    En fait je ne récupère pas le type mime à partir d'une servlet donc je ne peux pas utiliser
    getServletContext().getMimeType( nomDuFichier )
    . Voici mon 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
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
     
    public final class AjouterPhotoForm {
    private String validationPhoto( 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_PHOTO );
     
            System.out.println("la photo est: "+part);
                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() ) {
     
                    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." );
                    }
                }
                else
                {
                 throw new FormValidationException( "Vous n'avez sélectionné aucune photo." );
                }
            } 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 2Mo." );
            } 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;
        }
        /*
         * Ajoute un message correspondant au champ spécifié à la map des erreurs.
         */
        private void setErreur( String champ, String message ) {
            erreurs.put( champ, message );
        }
        /*
         * 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;
            }
        }
        /*
         * Méthode utilitaire qui a pour unique but d'analyser l'en-tête
         * "content-disposition", et de vérifier si le paramètre "filename" y est
         * présent. Si oui, alors le champ traité est de type File et la méthode
         * retourne son nom, sinon il s'agit d'un champ de formulaire classique et
         * la méthode retourne null.
         */
      private static String getNomFichier( Part part ) {
            /* Boucle sur chacun des paramètres de l'en-tête "content-disposition". */
            for ( String contentDisposition : part.getHeader( "content-disposition" ).split( ";" ) ) {
                /* Recherche de l'éventuelle présence du paramètre "filename". */
                if ( contentDisposition.trim().startsWith( "filename" ) ) {
                    /*
                     * Si "filename" est présent, alors renvoi de sa valeur,
                     * c'est-à-dire du nom de fichier sans guillemets.
                     */
                    return contentDisposition.substring( contentDisposition.indexOf( '=' ) + 1 ).trim().replace( "\"", "" );
                }
            }
            /* Et pour terminer, si rien n'a été trouvé... */
            return null;
        }
        /*
         * Méthode utilitaire qui a pour but d'écrire le fichier passé en paramètre
         * sur le disque, dans le répertoire donné et avec le nom donné.
         */
        private void ecrireFichier( InputStream contenuFichier, String nomFichier, String chemin )
                throws FormValidationException {
            /* Prépare les flux. */
            BufferedInputStream entree = null;
            BufferedOutputStream sortie = null;
            try {
                /* Ouvre les flux. */
                entree = new BufferedInputStream( contenuFichier, TAILLE_TAMPON );
                sortie = new BufferedOutputStream( new FileOutputStream( new File( chemin + nomFichier ) ),
                        TAILLE_TAMPON );
                /*
                 * Lit le fichier reçu et écrit son contenu dans un fichier sur le
                 * disque.
                 */
                byte[] tampon = new byte[TAILLE_TAMPON];
                int longueur = 0;
                while ( ( longueur = entree.read( tampon ) ) > 0 ) {
                    sortie.write( tampon, 0, longueur );
                }
            } catch ( Exception e ) {
                throw new FormValidationException( "Erreur lors de l'écriture du fichier sur le disque." );
            } finally {
                try {
                    sortie.close();
                } catch ( IOException ignore ) {
                }
                try {
                    entree.close();
                } catch ( IOException ignore ) {
                }
            }
        }
    }

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Bah, à priori, si : en tout cas tu as l'objet HttpServletRequest.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    request.getServletContext().getMimeType( nomDuFichier );
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  9. #9
    Membre actif
    Inscrit en
    Juin 2005
    Messages
    578
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 578
    Points : 240
    Points
    240
    Par défaut
    Ah oui c'est vrai.

    Sinon @joel.drigo, qu'est ce tu entends par
    Le fait d'intercaler un BufferedInputStream
    ? Peux-tu m'expliquer?

  10. #10
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Tu as juste à faire BufferedInputStream bufferedIs = new BufferedInputStream( inputStream ); et tu donnes ça à manger à ta méthode.

    Cdt.

  11. #11
    Membre actif
    Inscrit en
    Juin 2005
    Messages
    578
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 578
    Points : 240
    Points
    240
    Par défaut
    Je pense que c'est ce qui a été fait dans 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
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    private void ecrireFichier( InputStream contenuFichier, String nomFichier, String chemin )
                throws FormValidationException {
            /* Prépare les flux. */
            BufferedInputStream entree = null;
            BufferedOutputStream sortie = null;
            try {
                /* Ouvre les flux. */
                entree = new BufferedInputStream( contenuFichier, TAILLE_TAMPON );
                sortie = new BufferedOutputStream( new FileOutputStream( new File( chemin + nomFichier ) ),
                        TAILLE_TAMPON );
                /*
                 * Lit le fichier reçu et écrit son contenu dans un fichier sur le
                 * disque.
                 */
                byte[] tampon = new byte[TAILLE_TAMPON];
                int longueur = 0;
                while ( ( longueur = entree.read( tampon ) ) > 0 ) {
                    sortie.write( tampon, 0, longueur );
                }
            } catch ( Exception e ) {
                throw new FormValidationException( "Erreur lors de l'écriture du fichier sur le disque." );
            } finally {
                try {
                    sortie.close();
                } catch ( IOException ignore ) {
                }
                try {
                    entree.close();
                } catch ( IOException ignore ) {
                }
            }
        }

  12. #12
    Membre actif
    Inscrit en
    Juin 2005
    Messages
    578
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 578
    Points : 240
    Points
    240
    Par défaut
    Quand je fais 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
     
    String nomFichier = null;
     
            InputStream contenuFichier = null;
            try {
                Part part = request.getPart( CHAMP_PHOTO );
     
     
                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() ) {
     
                    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 =   request.getServletContext().getMimeType( contenuFichier );
    getMimetype ne prend que des String en paramètres.

    Comment faire?

  13. #13
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String contentType = request.getServletContext().getMimeType( nomFichier );
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  14. #14
    Membre actif
    Inscrit en
    Juin 2005
    Messages
    578
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 578
    Points : 240
    Points
    240
    Par défaut
    Bon ça marche sauf pour les images issues d'une capture d'écran c'est-à-dire que si je fais une capture d'écran avec "Outil capture" de windows, je reçois l'erreur suivante:

    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
    Grave: "Servlet.service()" pour la servlet AjouterPhoto a généré une exception
    java.lang.NullPointerException
    	at forms.AjouterPhotoForm.validationPhoto(AjouterPhotoForm.java:119)
    	at forms.AjouterPhotoForm.traiterPhoto(AjouterPhotoForm.java:78)
    	at forms.AjouterPhotoForm.creerCandidat(AjouterPhotoForm.java:54)
    	at servlets.AjouterPhoto.doPost(AjouterPhoto.java:50)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    	at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    	at filters.PrechargementFilter.doFilter(PrechargementFilter.java:66)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    	at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
    	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    	at java.lang.Thread.run(Thread.java:744)
    Le type du fichier est Image JPEG (.JPG)

  15. #15
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ben tu va à at forms.AjouterPhotoForm.validationPhoto(AjouterPhotoForm.java:119), et tu regarde ce qui s'y trouver, il y a un null là.

  16. #16
    Membre actif
    Inscrit en
    Juin 2005
    Messages
    578
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 578
    Points : 240
    Points
    240
    Par défaut
    Oui mais l'image n'est pas "null" car lorsque je ramène l'ancienne méthode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Collection<?> mimeTypes = MimeUtil.getMimeTypes( contenuFichier );
    Je n'ai pas ce message d'erreur.

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 56
    Points : 59
    Points
    59
    Par défaut Je confirme que ça fonctionne
    Bonjour,
    je voulais juste dire merci, notamment à joel, pour la solution (quelques mois de retard ce n'est pas encore "déterrer" pour confirmer une réponse :p ). Car je n'étais du tout au fait de ce qu'étais les mark ou reset indiqués dans le message d'erreur, merci pour les liens également. J'en saurai plus sur les flux
    Mais c'est vrai que la doc indique "InputStream" de façon générale, c'est bizarre, ils devraient alors décomposer la fonction en plusieurs qui ne prendrait chacune qu'un flux dont on est sûr qu'ils supportent les "mark" et "reset" afin d'être sûr de ne lever aucune exception.

    Nom : Developpez.jpg
Affichages : 607
Taille : 148,4 Ko

    Pour répondre à Nico, le getMimeType() ne se base que sur l'extension du fichier il me semble, donc si l'utilisateur renomme l'extension, un faux fichier peut passer à l'upload. Tandis que cette librairie analyse le contenu du fichier, et permet de détecter plus de mauvais fichiers.


    En tout cas ça marche au poil. Moi j'avais cette exception quand j'essayais d'upload un fichier .HTML (du moment que ce n'était pas une image en tout cas) pour tester le cas d'erreur. Mais du coup avec un Bu=fferedInputStream c'est parfait, l'erreur est bien récupérer au moment du test, et non pas à la simple récupération du type MIME lol

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    /* Extraction du type MIME du fichier depuis l'InputStream nommé "contenu" */
    MimeUtil.registerMimeDetector( "eu.medsea.mimeutil.detector.MagicMimeMimeDetector" );
    Collection<?> mimeTypes = MimeUtil.getMimeTypes( new BufferedInputStream(request.getPart( champImage )getInputStream()) );
     
    if ( !mimeTypes.toString().startsWith( mimeType )){
        throw new FormValidationException("Le type du fichier doit être une IMAGE");
    }

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/12/2013, 01h20
  2. Erreur "Must declare the scalar variable "@id"
    Par Devlin111 dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 15/03/2012, 12h26
  3. Réponses: 4
    Dernier message: 28/05/2009, 20h11
  4. Réponses: 4
    Dernier message: 23/02/2009, 19h21
  5. Réponses: 1
    Dernier message: 13/02/2007, 12h06

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