Salut ,,
Voila , j'ai un formulaire upload.jsp ou j'entre la description dans un champ text et j'ai un autre champ file , ou je met mon fichier , je veux après avoir cliquer sur le bouton Envoyer , afficher devant chaque champ le nom que j'ai déja ecris dans le champ descripton et le nom du fichier que j'ai uploader , sauf que ca me donne cette erreur : (je suis sur Apache Tomcat 7.0.41 , APi servlet 3.0)
java.lang.NullPointerException
com.fichiers.servlets.Upload.getNomFichier(Upload.java:85)
com.fichiers.servlets.Upload.doPost(Upload.java:62)
javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
Dans la console :
L'erreur de la console m'indique cette ligne (85) dans ma servlet Upload:
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 "Servlet.service()" pour la servlet com.fichiers.servlets.Upload a généré une exception java.lang.NullPointerException at com.fichiers.servlets.Upload.getNomFichier(Upload.java:85) at com.fichiers.servlets.Upload.doPost(Upload.java:62) 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.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:953) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) 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(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)
Voila ma servlet Upload :
Code : Sélectionner tout - Visualiser dans une fenêtre à part for ( String contentDisposition : part.getHeader( "Content-Disposition" ).split( ";" ) ) {
Mon formulaire dans la 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 public class Upload extends HttpServlet { private static final long serialVersionUID = 1L; private static final String vue_upload = "/WEB-INF/upload.jsp"; public static final String CHAMP_DESCRIPTION = "description"; public static final String CHAMP_FICHIER = "fichier"; public Upload() { super(); // TODO Auto-generated constructor stub } protected void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { this.getServletContext().getRequestDispatcher( vue_upload ).forward( request, response ); } protected void doPost( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { /* Récupération du contenu du champ de description */ String description = request.getParameter( CHAMP_DESCRIPTION ); request.setAttribute( CHAMP_DESCRIPTION, description ); /* * Les données reçues sont multipart, on doit donc utiliser la méthode * getPart() pour traiter le champ d'envoi de fichiers. */ Part part = request.getPart( CHAMP_FICHIER ); /* * Il faut déterminer s'il s'agit d'un champ classique ou d'un champ de * type fichier : on délègue cette opération à la méthode utilitaire * getNomFichier(). */ String nomFichier = getNomFichier( part ); /* * Si la méthode a renvoyé quelque chose, il s'agit donc d'un champ de * type fichier (input type="file"). */ if ( nomFichier != null && !nomFichier.isEmpty() ) { String nomChamp = part.getName(); request.setAttribute( nomChamp, nomFichier ); } this.getServletContext().getRequestDispatcher( vue_upload ).forward( request, response ); } /* * 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. */ return contentDisposition.substring( contentDisposition.indexOf( '=' ) + 1 ); } } /* Et pour terminer, si rien n'a été trouvé... */ return null; } }
Et enfin le 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 <form action="<c:url value="/Upload" />" method="post" enctype="multipart/form-data"> <fieldset> <legend>Envoi de fichier</legend> <label for="description">Description du fichier</label> <input type="text" id="description" name="description" value="" /> <span class="succes"><c:out value="${description}" /></span> <br /> <label for="fichier">Emplacement du fichier <span class="requis">*</span></label> <input type="file" id="fichier" name="fichier" /> <span class="succes"><c:out value="${fichier}" /></span> <br /> <input type="submit" value="Envoyer" class="sansLabel" /> <br /> </fieldset> </form>
Et 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 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <servlet> <servlet-name>Upload</servlet-name> <servlet-class>com.fichiers.servlets.Upload</servlet-class> <multipart-config> <location>C:\fichiers</location> <max-file-size>10485760</max-file-size> <!-- 10 Mo --> <max-request-size>52428800</max-request-size> <!-- 5 x 10 Mo --> <file-size-threshold>1048576</file-size-threshold> <!-- 1 Mo --> </multipart-config> </servlet> <servlet-mapping> <servlet-name>Upload</servlet-name> <url-pattern>/upload</url-pattern> </servlet-mapping> </web-app>
Partager