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 :

upload de fichier


Sujet :

Servlets/JSP Java

  1. #1
    Membre régulier
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2004
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2004
    Messages : 156
    Points : 90
    Points
    90
    Par défaut upload de fichier
    Bon je cherche une bonne documentation pour gérer l'upload de fichier dans une application jsp/servlet
    Tout ce que j'ai pu trouver n'étais pas très clair, incomplet ou qui ne fonctionne pas
    Et pour ce sujet google n'est pas moi ami (upload+jsp, upload+java ...), et rien de bien concluant

  2. #2
    Membre régulier
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2004
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2004
    Messages : 156
    Points : 90
    Points
    90
    Par défaut
    Bon apparemment il y a une librairie pour gérer l'upload de fichier, il s'agit de FileUpload
    http://jakarta.apache.org/commons/fileupload/

    Maintenant j'aimerais bien trouver des exemples ou de la documentations sur son fonctionnement

  3. #3
    Membre régulier
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2004
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2004
    Messages : 156
    Points : 90
    Points
    90
    Par défaut
    Bon j'ai voulu créer un bout de 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
    public void uploadFile(HttpServletRequest request, HttpServletResponse response) {
    	response.setContentType("text/html");
    	String fileName=null;
    	long sizeInBytes=0;
     
    	try { 
    		// Check that we have a file upload request
    		boolean isMultipart = ServletFileUpload.isMultipartContent(request);
    		if(isMultipart) {
    			// Create a factory for disk-based file items
    			FileItemFactory factory = new DiskFileItemFactory();
    			// Create a new file upload handler
    			ServletFileUpload upload = new ServletFileUpload(factory);
    			// Parse the request
    			List items = upload.parseRequest(request);
    			// Process the uploaded items
    			Iterator iter = (Iterator) items.iterator();
    			while (iter.hasNext()) {
    				/* fetch an item from the iterator above */
    				FileItem item = (FileItem) iter.next();
    				if (!item.isFormField()) {
    					/* retrives name of the file uploaded from the client machine */ 
    					fileName = item.getName(); 
    					/* retrives size in byte of the file uploaded from the client machine */ 
    					sizeInBytes = item.getSize(); 
    					/* Create a new file on server machine */
    					File uploadedFile = new File("C:\\test.txt"); 
    					/* following statement writes to uploadedFile in single stroke */ 
    					try {
    						item.write(uploadedFile);
    					} catch (Exception e) {e.printStackTrace();} 
    					/* job done ! */
    				}
    			}
    			System.out.println("success ......"+fileName+"... "+sizeInBytes+" uploaded...... ");
    		} else System.out.println("NOT a multipart content....... ");
    	} catch(FileUploadException e){System.out.println(e.getMessage());}
    }
    Mais j'ai l'erreur suivante qui apparait et je vois pas pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    exception
     
    javax.servlet.ServletException: L'exécution de la servlet a lancé une exception
     
    cause mère
     
    java.lang.NoSuchMethodError: org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(Lorg/apache/commons/fileupload/RequestContext;)Ljava/util/List;
    	org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:116)
    	com.dmpi.servlet.soins.Xml.uploadFile(Xml.java:58)
    	com.dmpi.servlet.soins.Xml.doAction(Xml.java:36)
    	com.dmpi.outil.ParentServlet.doGet(ParentServlet.java:27)
    	com.dmpi.outil.ParentServlet.doPost(ParentServlet.java:51)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 511
    Points : 386
    Points
    386
    Par défaut
    J'ai aussi galéré donc:
    1 - installe le commons-fileupload-1.2-src.zip dans le rep WEB-INF/lib
    2 - pour la jsp, le champs file doit se trouver dans un formulaire qui ne contiendra que ce champs et ses attributs. L'attribut enctype="multipart/form-data" apparemment inhibe le paramètre getParametter qui retourne systématiquement '' (traitement de classe imbriquée)
    3 - le fichier sera chargé dans le repertoire c:\tmp s'il n'existe pas le créer

    Pour ma part j'ai utilisé le code suivant qui est tiré de la doc http://www.javaatwork.com/java-uploa...amplecode.html

    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
     
    package librairie;
     
    import java.io.File;
    import java.util.Iterator;
    import java.util.List;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    import org.apache.commons.fileupload.FileItem;
    import org.apache.commons.fileupload.FileItemFactory;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
     
    /**
     * Class for storing the uploaded files.
     */
     
    public class Import_fich_txt {
     
      /**
        * The base upload directory. In this directory all uploaded files will
        * be stored. With the applet param tag 'directory' you can create a
        * subdirectory for a user. 
        * See http://www.javaatwork.com/parameters.html#directory for more 
        * information about the 'directory' param tag. For a Windows environment 
        * the BASE_DIRECTORY can be e.g. * 'c:/temp' for Linux environment '/tmp'.
        */
     
      private static final String BASE_DIRECTORY = "/tmp";
     
      public static void main(HttpSession session,HttpServletRequest request){ 
     
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
     
        // vérification multipart requête
        if (isMultipart) {
     
          //  Create a factory for disk-based file items
          FileItemFactory factory = new DiskFileItemFactory();
     
          //  Create a new file upload handler
          ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
     
          // Set upload parameters
          // See Apache Commons FileUpload for more information
          // http://jakarta.apache.org/commons/fileupload/using.html
          servletFileUpload.setSizeMax(-1);
     
          try {
            String directory = "";
            // Parse the request
            List items = servletFileUpload.parseRequest(request);
            // Process the uploaded items
            Iterator iter = items.iterator();
     
            while (iter.hasNext()) {
              FileItem item = (FileItem) iter.next();
              // the param tag directory is sent as a request parameter to
              // the server
              // check if the upload directory is available
              if (item.isFormField())
              	{String name = item.getFieldName();
              	 System.out.println("- "+item.getString()+item.getFieldName());
              	 //System.out.println("- "+request.getAttribute("option"));
                 if(name.equalsIgnoreCase("directory"))
                	{directory = item.getString();}
                 // retrieve the files
              	}
              else
              	{// nommage du fichier
            	 //System.out.println(item.getString());  //affiche le fichier
            	  String fileName = item.getName();
            	  File file = new File(fileName);
            	  file = new File(BASE_DIRECTORY, file.getName());
                 //enregistremen dans /tmp/ si non vide
                 if(item.getInputStream().read()>-1)
                	 {item.write(file);
                	  session.setAttribute("file", file.getPath());}
              }
            }
     
          } catch (Exception e) {
            e.printStackTrace();
    //        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
          }
    //      response.setStatus(HttpServletResponse.SC_OK);
        } else {
    //      response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
        }
      }
    }

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 130
    Points : 68
    Points
    68
    Par défaut
    J'ai le meme code que toi mais toujours la meme erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    java.lang.NoSuchMethodError: org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(Lorg/apache/commons/fileupload/RequestContext;)Ljava/util/List;
    	org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)
    	com.cmsspring.document.controller.TexteAddFormController.onSubmit(TexteAddFormController.java:66)
    	org.springframework.web.servlet.mvc.SimpleFormController.processFormSubmission(SimpleFormController.java:267)
    	org.springframework.web.servlet.mvc.AbstractFormController.handleRequestInternal(AbstractFormController.java:250)
    	org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153)
    	org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
    	org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:857)
    	org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:792)
    	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:475)
    	org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:440)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    voici le code de mon controlleur
    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
    protected ModelAndView onSubmit(HttpServletRequest request, 
    			HttpServletResponse response, Object command, BindException errors) throws Exception {
     
    		logger.info("Entering controller");
    		Texte texte = (Texte)command;
    		texte.setTaille(1);
    		texte.setId(1);
    		//recupération du fichier 
     
    		boolean isMultipart = ServletFileUpload.isMultipartContent(request);
    		if(!isMultipart){
    			System.out.println("pas multipart");
     
    		}
     
     
    //		 Create a factory for disk-based file items
    		FileItemFactory factory = new DiskFileItemFactory();
     
    //		 Create a new file upload handler
    		ServletFileUpload upload = new ServletFileUpload(factory);
    		 // Set upload parameters
    	      // See Apache Commons FileUpload for more information
    	      // http://jakarta.apache.org/commons/fileupload/using.html
    	      upload.setSizeMax(-1);
     
    	      try {
    	          String directory = "";
    	          // Parse the request
    	          List items = upload.parseRequest(request);
    	          // Process the uploaded items
    	          Iterator iter = items.iterator();
     
    	          while (iter.hasNext()) {
    	            FileItem item = (FileItem) iter.next();
    	            // the param tag directory is sent as a request parameter to
    	            // the server
    	            // check if the upload directory is available
    	            if (item.isFormField())
    	            	{String name = item.getFieldName();
    	            	 System.out.println("- "+item.getString()+item.getFieldName());
    	            	 //System.out.println("- "+request.getAttribute("option"));
    	               if(name.equalsIgnoreCase("directory"))
    	              	{directory = item.getString();}
    	               // retrieve the files
    	            	}
    	            else
    	            	{// nommage du fichier
    	          	 //System.out.println(item.getString());  //affiche le fichier
    	          	  String fileName = item.getName();
    	          	  File file = new File(fileName);
    	          	  file = new File(BASE_DIRECTORY, file.getName());
    	               //enregistremen dans /tmp/ si non vide
    	               if(item.getInputStream().read()>-1)
    	              	 {item.write(file);
    	              	  session.setAttribute("file", file.getPath());}
    	            }
    	          }
     
    	        } catch (Exception e) {
    	          e.printStackTrace();
    //	          response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
    	        }
    		// fin recuperation
     
    		logger.info("Received : File Texte " + texte.getTitre() + " ");
    		//texteService.saveTexte(texte);
    		logger.info("Returning from UserAddFormController view to " + getSuccessView());
    		return new ModelAndView(new RedirectView(getSuccessView()));
    	}
    l'erreur est sur cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     List items = upload.parseRequest(request);
    je ne comprend pas pourquoi?
    je suis dans un classe java.
    quelqu'un a une idée

  6. #6
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 12
    Points : 14
    Points
    14
    Par défaut
    Tu es sur d'avoir "commons-fileupload-1.0.jar" dans WEB-INF/lib ?

    Si oui, télécharge à nouveau la librairie !

  7. #7
    En attente de confirmation mail
    Inscrit en
    Mai 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 56
    Points : 54
    Points
    54
    Par défaut
    Il est possible qu'il y ait conflit entre ta librairie filupload de ton projet et une librairie déjà existante sur ton serveur (Tomcat ou autre). Le classloader va donc charger en premier la librairie incluse directement dans Tomcat. or, si il s'agit d'une ancienne version de la librairie, la méthode ServletFileUpload.parseRequest peut ne pas exister ou sa signature peut voir changé d'où l'erreur.

    Bienvenue dans le joyeux monde des classloaders ...

    Je te conseille donc :
    1. de vérifier la version de ton serveur (Tomcat ?) et si possible, de prendre une version plus récente.
    2. de regarder dans les libs incluses directement par le serveur si il n'y a pas fileupload. Si c'est le cas et qu'aucun autre de tes projets ne l'utilise, supprime la.
    3. Si aucune de ces solution n'est possible, de configurer le classpath de ton projet de manière à charger le jar fileupload (le tien) en premier. noter que cela peut être compliqué selon les IDE (sous Eclipse WTP par exemple). Une tâche ant peut peut-être aider mais je ne suis pas spécialiste.

    En espérant que ça puisse aider ...

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 130
    Points : 68
    Points
    68
    Par défaut
    Merci beaucoup tout marche nickel j'ai juste telecharger la dernière version j'en avais une ancienne
    par contre mon nouveau soucis est que j'ai deux trucs deprecated
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		DiskFileUpload upload = new DiskFileUpload();
    		List items = upload.parseRequest(request);
    par quoi elles ont été remplacées?
    merci d'avance

  9. #9
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 12
    Points : 14
    Points
    14
    Par défaut
    Google va redevenir ton ami !

    Tu tapes "DiskFileUpload" et dans la javadoc c'est magique il te le dit par quoi il faut remplacer ! C'est pas beau ça !

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 53
    Points : 37
    Points
    37
    Par défaut
    J'aurai une question par rapport à l'upload de fichier utilisant l'API FileUpload.
    On utilise pas de bean dans ce cas là ? comment fait-on passer le chemin du fichier de la jsp vers la servlet ?

    Merci par avance, parce que je galère sur l'upload de fichier...

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 130
    Points : 68
    Points
    68
    Par défaut
    Salut
    Je n'ai pas de doc non plus
    mais il y a des exemple pas mal sur le site d'apache si tu veux
    A plus

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 53
    Points : 37
    Points
    37
    Par défaut
    Merci, j'ai vu les petits exemples dans le userguide, mais je voulais comprendre, comment ça se passait entre la jsp et la servlet.

    Sinon j'ai une autre question, cette facon de faire avec fileupload, ne marche qu'avec une servlet qui étend une HttpServlet, on peut pas faire ça avec une servlet qui étend une Action ?

  13. #13
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 54
    Points : 42
    Points
    42
    Par défaut
    pour récupérer le nom ou répertoire de ton fichier d'une jsp vers une servlet
    tu fais :
    dans JSP :
    <input type="file" name="fichier" value="toto">

    dans servlet :
    String fic = request.getParameter("fichier");

Discussions similaires

  1. [FTP] Problème pour uploader un fichier
    Par Crazyblinkgirl dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 07/01/2008, 23h21
  2. Upload de fichier par XMLHTTP
    Par Immobilis dans le forum ASP
    Réponses: 6
    Dernier message: 21/01/2005, 18h02
  3. upload de fichier
    Par 120 dans le forum ASP
    Réponses: 16
    Dernier message: 21/06/2004, 13h07
  4. Upload de fichiers sur un ftp
    Par Crazyblinkgirl dans le forum ASP
    Réponses: 10
    Dernier message: 20/06/2004, 12h55
  5. Upload de fichiers
    Par GDVL dans le forum ASP
    Réponses: 4
    Dernier message: 03/06/2004, 13h44

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