Bonjour
J'essaie d'insérer un fichier dans ma base de données en suivant l'exemple donné dans le tuto "Créez votre application web avec Java EE". L'insertion marche bien sauf que lorsque la taille du fichier dépasse les 2mo que j'ai spécifiés dans le web.xml, j'ai ce message d'erreur:
Voici mes 2 méthodes de validation du fichier:janv. 20, 2015 4:46:03 PM org.apache.catalina.core.StandardWrapperValve invoke
Grave: "Servlet.service()" pour la servlet FinaliserInscription a généré une exception
java.lang.NullPointerException
at forms.FinaliserInscriptionForm.validationCivilite(FinaliserInscriptionForm.java:338)
at forms.FinaliserInscriptionForm.traiterCivilite(FinaliserInscriptionForm.java:167)
at forms.FinaliserInscriptionForm.creerCandidat(FinaliserInscriptionForm.java:128)
at servlets.FinaliserInscription.doPost(FinaliserInscription.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)
Et voici mon fichier web.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
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 public final class FinaliserInscriptionForm { .... 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 ); 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." ); } } } 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; } private String validationCv( 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_CV ); 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" ) || mimeTypes.toString().startsWith( "application/pdf" ) || mimeTypes.toString().startsWith( "application/msword" ) ) { /* Écriture du fichier sur le disque */ ecrireFichier( contenuFichier, nomFichier, chemin ); } else { throw new FormValidationException( "Le fichier envoyé doit être une image, un pdf ou un word." ); } } } 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; } .... }
Et voici la servlet Image:
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 <?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>FinaliserInscription</servlet-name> <servlet-class>servlets.FinaliserInscription</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> </web-app>
Merci
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 /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package servlets; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.URLDecoder; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Image extends HttpServlet { public static final int TAILLE_TAMPON = 10240; // 10ko public void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { /* * Lecture du paramètre 'chemin' passé à la servlet via la déclaration * dans le web.xml */ String chemin = this.getServletConfig().getInitParameter( "chemin" ); /* * Récupération du chemin du fichier demandé au sein de l'URL de la * requête */ String fichierRequis = request.getPathInfo(); /* Vérifie qu'un fichier a bien été fourni */ if ( fichierRequis == null || "/".equals( fichierRequis ) ) { /* * Si non, alors on envoie une erreur 404, qui signifie que la * ressource demandée n'existe pas */ response.sendError( HttpServletResponse.SC_NOT_FOUND ); return; } /* * Décode le nom de fichier récupéré, susceptible de contenir des * espaces et autres caractères spéciaux, et prépare l'objet File */ fichierRequis = URLDecoder.decode( fichierRequis, "UTF-8" ); File fichier = new File( chemin, fichierRequis ); /* Vérifie que le fichier existe bien */ if ( !fichier.exists() ) { /* * Si non, alors on envoie une erreur 404, qui signifie que la * ressource demandée n'existe pas */ response.sendError( HttpServletResponse.SC_NOT_FOUND ); return; } /* Récupère le type du fichier */ String type = getServletContext().getMimeType( fichier.getName() ); /* * Si le type de fichier est inconnu, alors on initialise un type par * défaut */ if ( type == null ) { type = "application/octet-stream"; } /* Initialise la réponse HTTP */ response.reset(); response.setBufferSize( TAILLE_TAMPON ); response.setContentType( type ); response.setHeader( "Content-Length", String.valueOf( fichier.length() ) ); response.setHeader( "Content-Disposition", "inline; filename=\"" + fichier.getName() + "\"" ); /* Prépare les flux */ BufferedInputStream entree = null; BufferedOutputStream sortie = null; try { /* Ouvre les flux */ entree = new BufferedInputStream( new FileInputStream( fichier ), TAILLE_TAMPON ); sortie = new BufferedOutputStream( response.getOutputStream(), TAILLE_TAMPON ); /* Lit le fichier et écrit son contenu dans la réponse HTTP */ 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 ) { } } } }
Partager