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 :

Formulaire d'envoi d'image et de données


Sujet :

Servlets/JSP Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 60
    Par défaut Formulaire d'envoi d'image et de données
    Bonjour,

    Je possède un formulaire dans ma page jsp qui me permet de rentrer des informations sur une image (nom, description, etc...) et de choisir une image sur le disque dur.
    J'aimerai sauvegarder les informations dans ma base de données et l'image sur le serveur tomcat.

    Pour l'upload de l'image j'utilise javazoom.upload.UploadBean.

    Une fois dans mon code java, je récupère dans ma fonction doPost un MultipartFormDataRequest. Dans mon fichier jsp, mon formulaire est donc définit avec enctype="multipart/form-data".

    Le problème c'est qu'avec la balise enctype="multipart/form-data", j'arrive a récupérer l'image et la mettre sur le serveur, mais je n'arrive pas a récupérer les autres infos du formulaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MultipartFormDataRequest mrequest = new MultipartFormDataRequest(request);
                    String idUser = mrequest.getParameter("idUser");
    Mon getParameter me renvoie "null".

    Si j'enlève enctype="multipart/form-data" et que je récupère dans mon code java mes données avec l'objet HttpServletRequest (donc pas multi) j'arrive a tout récupérer sauf l'image.

    Comprenez vous ce qui cloche dans mon code?

    Voici le fichier 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
    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1"%>
     
        <%@page import="connexionBase.ConnexionBase" %>
        <%@page import="java.sql.Connection" %>
        <%@page import="java.awt.*" %>
        <%@page import="objets.Image" %>
        <%@page import="java.util.List" %>
        <%@page import="java.util.ArrayList" %>
        <%@ page language="java" import="javazoom.upload.*,java.util.*" %>
        <%@ page errorPage="ExceptionHandler.jsp" %>
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <jsp:useBean id="userCo" class="beans.UserCoBean" scope="session"></jsp:useBean>
     
    <jsp:useBean id="upBean" scope="page" class="javazoom.upload.UploadBean" >
      <jsp:setProperty name="upBean" property="folderstore" value="c:/uploads" />
      <jsp:setProperty name="upBean" property="parser" value="<%= MultipartFormDataRequest.CFUPARSER %>"/>
      <jsp:setProperty name="upBean" property="parsertmpdir" value="c:/temp"/>
      <jsp:setProperty name="upBean" property="overwritepolicy" value="nametimestamp" />
    </jsp:useBean>
     
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Poster une image</title>
    </head>
    <body>
    <h2>Bienvenue <jsp:getProperty name="userCo" property="nom"/> <jsp:getProperty name="userCo" property="prenom"/></h2><br />
    <form action="EnregistrerImage" name="form" method="POST" enctype="multipart/form-data">
    <fieldset><legend>Poster une image</legend>
    	<input type="hidden" id="idUser" name="idUser" value='<jsp:getProperty property="id" name="userCo"/>' />
    	<table>
    		<tr>
    			<th>Nom :</th>
    			<td><input type="text" id="nomImg" name="nomImg" /></td>
    		</tr>
    		<tr>
    			<th>Description :</th>
    			<td><textarea id="descImg" name="descImg"></textarea></td>
    		</tr>
    		<tr>
    			<th>Catégorie :</th>
    			<td><select name="categ">							
    					<option selected></option>
    					<option value="Sport">Sport</option>
    					<option value="Nature">Nature</option>
    					<option value="Voiture">Voitures</option>
    					<option value="Celebrite">Célébrités</option>
    				</select>
    			</td>
    		</tr>
    		<tr>
    			<th>Fichier :</th>
    			<td><input type="file" id="fichierImg" name="fichierImg"/></td>
    		</tr>
    	</table>
    	<br>
    <input type=submit id="btnEnvoi" value="Envoyer" />
    </fieldset>
    </form>
    	<script type="text/javascript">
            
            </script>
     
    </body>
    </html>
    Le post envoi directement vers EnregistrerImage.

    Voici le fichier java EnregistrerImage.java:

    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
    package servlets;
     
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
     
     
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.sql.SQLException;
     
    import java.util.Hashtable;
    import java.util.Iterator;
    import java.util.List;
    import java.util.UUID;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
     
    import javazoom.upload.MultipartFormDataRequest;
    import javazoom.upload.UploadBean;
    import javazoom.upload.UploadException;
    import javazoom.upload.UploadFile;
    import org.apache.tomcat.util.http.fileupload.FileItem;
    import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory;
    import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload;
    import traitements.Enregistrement;
    import traitements.GetIdCateg;
     
    public class EnregistrerImage extends HttpServlet {
    	private static final long serialVersionUID = 1L;
     
        /**
         * @see HttpServlet#HttpServlet()
         */
        public EnregistrerImage() {
            super();
        }
     
        /**
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                // TODO Auto-generated method stub
        }
     
        /**
         * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
         */
     
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
        {
    		// On upload l'image sur le serveur
            uploadImage(request, response);
     
            if (MultipartFormDataRequest.isMultipartFormData(request))
            {
                try 
                {
                    MultipartFormDataRequest mrequest = new MultipartFormDataRequest(request);
                    String idUser = mrequest.getParameter("idUser");
     
                    out.print(idUser);
                }
                catch (UploadException ex)
                {
                    out.print(ex.getMessage());
                }
     
            }       
        }
     
    	//
    	//	Fonction d'upload de l'image sur le serveur tomcat
    	//
        protected void uploadImage(HttpServletRequest request, HttpServletResponse response) throws IOException
        {        
     
            UploadBean upBean = new UploadBean();
            try
            {
                upBean.setFolderstore("c:/uploads");
            }
            catch (UploadException ex)
            {
            }
     
            upBean.setParser(MultipartFormDataRequest.CFUPARSER);
            upBean.setParsertmpdir("c:/temp");
            upBean.setOverwritepolicy("nametimestamp");
     
            if (MultipartFormDataRequest.isMultipartFormData(request))
            {
                try
                {
                    MultipartFormDataRequest mrequest = new MultipartFormDataRequest(request);
                    Hashtable files = mrequest.getFiles();
     
                    if ((files != null) && (!files.isEmpty()))
                    {
                        upBean.store(mrequest, "fichierImg");
                    }
                }
                catch (UploadException ex)
                {
                }
            }
        }
     
     
     
     
     
    }

    J'ai une autre question tant qu'on y est:

    Le but de mon appli est de permettre à un utilisateur de choisir une image sur son pc, l'enregistrer sur le serveur, et pouvoir lister toutes les images qu'il a ajouté.

    Je me demandai si il était possible de sauvegarder l'image directement dans la base de données au lieu du serveur. Car pour ré-afficher les images, il faut utiliser la balise <img /> dans le code jsp avec le paramètre "src". Le problème c'est que si l'image est sur la base de données, elle ne possède pas de chemin (url) à mettre dans src. Y a-t-il un subtile subterfuge pour afficher une image depuis la bdd?

    Voilà, merci d'avance pour votre aide!

  2. #2
    Membre chevronné Avatar de Drakiss
    Homme Profil pro
    Consultant MOE
    Inscrit en
    Octobre 2010
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Consultant MOE
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2010
    Messages : 185
    Par défaut
    Je ne voit pas où tu récupère le form qui vient de la request, et ou tu extrait ses données pour alimenter un objet qui contiendrait les champs nécessaire à alimenter ta base ou même à stocker dans un fichier à côté de l'image, est-ce que ça vient de ton problème d'enctype ??

    Ensuite, je dirai que tu devrai fractionner les deux formulaires, d'abord la personne upload le fichier, et ensuite peux le commenter, tout ça en deux étapes distinctes, non ?

    Et pour ce qui est de l'affichage à partir de la base de donnée, il existe toujours une chemin de toute façon, il faut bien que le fichier soit entreposé quelque part en dur, non ?

    Va voir ici pour une base en mysql

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 60
    Par défaut
    Salut et merci d'avoir répondu.

    Je ne voit pas où tu récupère le form qui vient de la request, et ou tu extrait ses données pour alimenter un objet qui contiendrait les champs nécessaire à alimenter ta base ou même à stocker dans un fichier à côté de l'image, est-ce que ça vient de ton problème d'enctype ??
    Dans la version que j'ai posté je ne sauvegarde pas dans la base de données (la sauvegarde vers la BDD fonctionne, je ne l'ai donc pas posté).
    Je récupère le "idUser" qui est un input hidden du form du jsp. Mais il me renvoi "null".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MultipartFormDataRequest mrequest = new MultipartFormDataRequest(request);
    String idUser = mrequest.getParameter("idUser"); // Ici le string idUser est null
    Et c'est pareil si j'essaie de récupérer "descImg" qui est le textarea ou n'importe quelle élément du form.
    Mais par contre, si j'enlève le enctype du form et que je récupère les données directement depuis le request ça fonctionne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
    	String idUser = request.getParameter("idUser"); // Le string prend bien la valeur du hidden
    	String description = request.getParameter("descImg"); // Le string prend bien la valeur de mon textArea du form
    }
    Ensuite, je dirai que tu devrai fractionner les deux formulaires, d'abord la personne upload le fichier, et ensuite peux le commenter, tout ça en deux étapes distinctes, non ?
    C'est vrai que ce serait une solution, mais dans mon cas précis je dois tout récupérer en une fois (un seul formulaire).
    Ou alors deux formulaires dans le même jsp? Mais dans ce cas comment récupérer les deux formulaires séparément dans mon java?

    Et pour ce qui est de l'affichage à partir de la base de donnée, il existe toujours une chemin de toute façon, il faut bien que le fichier soit entreposé quelque part en dur, non ?
    Pas vraiment enfaite, l'image dans la base de données serait stockée au format byte (ou autre). Donc pas d'url lié.


    Je vais jeter un coup d’œil de suite.

  4. #4
    Membre chevronné Avatar de Drakiss
    Homme Profil pro
    Consultant MOE
    Inscrit en
    Octobre 2010
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Consultant MOE
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2010
    Messages : 185
    Par défaut
    De rien pour la réponse

    Je viens de tomber sur ça : http://www.developpez.net/forums/d93...acteres-arabe/

    et de comprendre qu'il te manque l'idée que quand tu envoi un enctype="multipart/form-data", tout est envoyé en même temps.

    Typiquement : ""multipart/form-data" contains a series of parts. Each part is
    expected to contain a content-disposition header [RFC 2183] where the
    disposition type is "form-data", and where the disposition contains
    an (additional) parameter of "name", where the value of that
    parameter is the original field name in the form. For example, a part
    might contain a header:

    Content-Disposition: form-data; name="user"

    with the value corresponding to the entry of the "user" field."

    Ca vient de la norme [RFC2388] de ce site : http://www.la-grange.net/w3c/html4.0...ml#ref-RFC2388

    Je te laisse te dépatouiller avec ça pour le moment, reviens-nous voir si tu n'y arrive toujours pas.

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 60
    Par défaut
    Merci, j'avance!

    Après plusieurs tests, en gardant le enctype="multipart/form-data", j'arrive a récupérer mes informations:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (Enumeration e = mrequest.getParameterNames() ; e.hasMoreElements() ;)
    {
    	String s = e.nextElement().toString();
    	out.print("\n" + s + " : " + mrequest.getParameter(s));
    }
    Je peux donc sauvegarder mes infos dans ma BDD et mon image sur le serveur. Mais il y a maintenant un autre problème avec l'uploadBean: impossible de définir soit même le nom du fichier uploadé sur le serveur, ni de récupérer le nom du fichier une fois sauvegardé.
    Du coup je n'ai aucun moyen de sauvegarder l'url de mon image dans ma BDD.

    Une idée?

Discussions similaires

  1. [MySQL] Formulaire d'envoi d'image
    Par cleminute dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 14/04/2010, 09h38
  2. Réponses: 3
    Dernier message: 10/04/2009, 13h26
  3. Formulaire n'envoie pas les données
    Par vladock dans le forum Langage
    Réponses: 7
    Dernier message: 04/08/2008, 13h24
  4. Réponses: 1
    Dernier message: 26/11/2006, 10h57
  5. [MySQL] Envoi d'images par formulaire et post-traitement
    Par mathieu7497 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 08/04/2006, 13h58

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