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

JDBC Java Discussion :

Serialization BLOB: mySql


Sujet :

JDBC Java

  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 126
    Par défaut Serialization BLOB: mySql
    Bonjour, j'ai un souci.
    J'ai une base de donnée mySQL qui contient des Blobs.
    J'ai une servlet qui communique avec un serveur par le biais d'une socket et le serveur communique avec JDBC avec ma base.

    J'essaie de récupérer mon blob et de le mettre dans une classe contenant toutes mes infos nécessaires et d'ensuite envoyer ce blob par la socket. Le soucis est que l'objet que je récupère est un com.mysql.jdbc.Blob et non un java.sql.Blob mais ca je pense que ca ne pose pas de problème.

    La où est le soucis c'est que au moment de l'envoie de mon objet sur la socket, j'ai une erreur dont voici la stackstrace:

    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
    java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: com.mysql.jdbc.Blob
    	java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1333)
    	java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
    	java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
    	java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
    	java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
    	java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
    	java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
    	java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
    	java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
    	java.io.ObjectInputStream.readArray(ObjectInputStream.java:1667)
    	java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1323)
    	java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
    	java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
    	java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
    	java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
    	java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
    	ConnectionSocket.SendReceive.receive(SendReceive.java:40)
    	BTMPPkg.BTMPClient.recoit(BTMPClient.java:59)
    	BTMPPkg.BTMPClient.recupFilm(BTMPClient.java:90)
    	Servlet.servletBTMP.processRequest(servletBTMP.java:39)
    	Servlet.servletBTMP.doGet(servletBTMP.java:86)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    voici mon objet que je veux sérialisé:
    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
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
     
    package BTMPPkg.Data;
     
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.Serializable;
    import java.sql.Blob;
    import java.sql.SQLException;
    import java.util.Date;
    import java.util.Vector;
     
     
    public class Films implements Serializable
    {
        private static final long serialVersionUID = 4368390168812353361L;
        private int id;
        private String Nom;
        private Date date_de_sortie;
        private double duree;
        private String couleur;
        private String mpaa;
        private String genre;
        private String acteur;
        private String producteur;
        private String maisonProduction;
        private String qualite;
        private Blob affiche;
     
        public Films(){}
     
        public Films(int id,String Nom,Date date_de_sortie,double duree,String couleur,String mpaa,String genre,String acteur,String producteur,String maisonProduction,String qualite)
        {
            this.id = id;
            this.Nom = Nom;
            this.date_de_sortie = date_de_sortie;
            this.duree = duree;
            this.couleur = couleur;
            this.mpaa = mpaa;
            this.genre = genre;
            this.acteur = acteur;
            this.producteur = producteur;
            this.maisonProduction = maisonProduction;
            this.qualite = qualite;
     
        }
     
     
        public Vector getVector()
        {
            Vector v = new Vector();
     
            v.add(getId());
            v.add(getNom());
            v.add(getDate_de_sortie());
            v.add(getDuree());
            v.add(getCouleur());
            v.add(getMpaa());
            v.add(getGenre());
            v.add(getActeur());
            v.add(getProducteur());
            v.add(getMaisonProduction());
            v.add(getQualite());
     
            return v;
        }
     
        /**
         * @return the id
         */
        public int getId() {
            return id;
        }
     
        /**
         * @return the Nom
         */
        public String getNom() {
            return Nom;
        }
     
        /**
         * @param id the id to set
         */
        public void setId(int id) {
            this.id = id;
        }
     
        /**
         * @param Nom the Nom to set
         */
        public void setNom(String Nom) {
            this.Nom = Nom;
        }
     
        /**
         * @return the date_de_sortie
         */
        public Date getDate_de_sortie() {
            return date_de_sortie;
        }
     
        /**
         * @param date_de_sortie the date_de_sortie to set
         */
        public void setDate_de_sortie(Date date_de_sortie) {
            this.date_de_sortie = date_de_sortie;
        }
     
        /**
         * @return the duree
         */
        public double getDuree() {
            return duree;
        }
     
        /**
         * @param duree the duree to set
         */
        public void setDuree(double duree) {
            this.duree = duree;
        }
     
        /**
         * @return the mpaa
         */
        public String getMpaa() {
            return mpaa;
        }
     
        /**
         * @param mpaa the mpaa to set
         */
        public void setMpaa(String mpaa) {
            this.mpaa = mpaa;
        }
     
        /**
         * @return the genre
         */
        public String getGenre() {
            return genre;
        }
     
        /**
         * @param genre the genre to set
         */
        public void setGenre(String genre) {
            this.genre = genre;
        }
     
        /**
         * @return the acteur
         */
        public String getActeur() {
            return acteur;
        }
     
        /**
         * @param acteur the acteur to set
         */
        public void setActeur(String acteur) {
            this.acteur = acteur;
        }
     
        /**
         * @return the producteur
         */
        public String getProducteur() {
            return producteur;
        }
     
        /**
         * @param producteur the producteur to set
         */
        public void setProducteur(String producteur) {
            this.producteur = producteur;
        }
     
        /**
         * @return the maisonProduction
         */
        public String getMaisonProduction() {
            return maisonProduction;
        }
     
        /**
         * @param maisonProduction the maisonProduction to set
         */
        public void setMaisonProduction(String maisonProduction) {
            this.maisonProduction = maisonProduction;
        }
     
        /**
         * @return the qualite
         */
        public String getQualite() {
            return qualite;
        }
     
        /**
         * @param qualite the qualite to set
         */
        public void setQualite(String qualite) {
            this.qualite = qualite;
        }
     
        /**
         * @return the couleur
         */
        public String getCouleur() {
            return couleur;
        }
     
        /**
         * @param couleur the couleur to set
         */
        public void setCouleur(String couleur) {
            this.couleur = couleur;
        }
     
        /**
         * @return the affiche
         */
        public InputStream getAffiche() throws SQLException, FileNotFoundException, IOException {
     
            return affiche.getBinaryStream();
        }
     
        /**
         * @param affiche the affiche to set
         */
        public void setAffiche(Blob affiche) throws SQLException {
     
            this.affiche = affiche;
        }
    }
    et voici la partie du code qui récupère mon blob:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    while (rs.next())
                {
                    Date d = rs.getDate(2);
                    Films f = null;
                    if(d.after(c.getTime()))
                    {
                        f = new Films(rs.getInt(3),rs.getString(4),rs.getDate(5),rs.getDouble(6),rs.getString(7),rs.getString(8),rs.getString(9),rs.getString(10),rs.getString(11),rs.getString(12),rs.getString(13));
                        Blob b= (Blob) rs.getBlob("Affiche");
                        f.setAffiche(b);
     
                        films.add(new Seance(rs.getString(1),rs.getDate(2),f));
     
                    }
                }
    Le rs est bien rempli car si je ne met pas le blob je peux recevoir le reste de la classe.


    Merci d'avance

    Julien

  2. #2
    Membre chevronné Avatar de ngpub
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 449
    Par défaut
    Le type java.sql.Blob n'est pas serializable, il faut que tu lises (en fait c'est un flux) ton blob et que tu places son contenu dans une structure serializable, à minima ça peut être un tableau d'octets (byte[]).

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 126
    Par défaut
    Merci pour la réponse. C'est fait par contre j'ai un autre soucis qui y est lie. J'aimerais afficher cette image dans une jsp dans <img src=

    comment faire pour utiliser mon byte[] suis je oublige de passer par une servlet qui va transformer mon flux ou je peux le faire directe a partir de mon byte[] ? Merci d'avance

  4. #4
    Membre chevronné Avatar de ngpub
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 449
    Par défaut
    Je ne suis pas fin connaisseur des JSP mais je pense que si tes octets sont ceux d'un fichier image (JPEG, PNG, ...), il faut d'abord que tu les placent dans un fichier sur ton serveur pour après indiquer l'adresse de ce fichier/image dans le HTML de ton JSP. Sinon je crois que tu peux créer une servlet ou un JSP (les JSP ne sont pas des servlets au final ? ) qui sera vue comme une image pour pouvoir retourner tes octets sans les enregistrer sur le serveur.

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Il n'y a pas besoin d'enregistrer ton image, tu peux le faire de 2 façons :

    - utiliser une servlet pour l'url de l'image
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <img src="./maServletImage?identifiantImage=10254" />
    - utiliser un filtre qui interprétera l'url
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <img src="./virtualImages/10254" />
    (en supposant que 10254 soit la clé primaire permettant d'accéder à "l'image" (byte[])

    Ensuite, que ce soit une servlet ou un filtre, le principe est très proche...
    Tu balances le flux vers response.getOutputStream().
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 126
    Par défaut
    Bonjour,
    Merci pour ces éclairsissements, je me suis d'ailleurs documenté sur les filtres ^^

    Par ailleurs, je ne vois pas comment faire pour que ma servlet aie accès à mon byte[]. j'ai un bean avec une instance de ma classe film dedans contenant mon byte[]. c'est de mon bean que j'appelle la servlet mais je ne sais pas comment lui envoyé mon byte[]?

    Merci d'avance

  7. #7
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par garciajulien Voir le message
    ...
    Par ailleurs, je ne vois pas comment faire pour que ma servlet aie accès à mon byte[]. j'ai un bean avec une instance de ma classe film dedans contenant mon byte[]. c'est de mon bean que j'appelle la servlet mais je ne sais pas comment lui envoyé mon byte[]?
    ???

    Ce ne serait pas plutôt une page qui référence ton bean ? (accessoirement, la servlet aussi)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 126
    Par défaut
    J'ai un bean qui communique avec une servlet pour récupérer des films dans ma bd. Ces films sont stockées dans mon bean. Mon bean est "instancié" dans ma jsp. et dans ma jsp j'aimerai affiché l'image contenue dans mes films dans mon bean.

    J'espère avoir été plus clair !

  9. #9
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    A vrai dire, je ne sais pas si on peut directement utiliser le flux dans la page et le faire voire comme une image... en tout cas, je ne l'ai jamais fait... je regarderai de ce côté, ça m'intéresse...

    Une solution serait de stocker ton bean dans la session et d'utiliser un filtre pour renvoyer le flux pour la balise <img>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 126
    Par défaut
    voila j'ai fait ce que vous m'avez dis mais j'ai quelque chose qui ne fonctionne toujours pas. En fait maintenant il m'affiche bien mon image mais le problème c'est qu'il ne passe qu'une fois dans ma servlet.

    voici le 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
    <div style="line-height:5px;">
    		<% bFilm.RecupFilm();
       session.setAttribute("bFilm", bFilm);
    %>
                    <% films=bFilm.getListSeance(); %>
     
            <%
               for(int i=0;i<films.getSize();i++)
               {
                   film = films.getFilm(i);
                   session.setAttribute("numFilm", i);
    		 %>
                     <table width="397" border="1" class="tableFilm">
                        <tr>
                            <td width="97" height="146" class="tdFilm"><img src="./filmToStream" alt=""/></td>
                            <td width="284" height="146" class="tdFilm">
                                Titre : <%= film.getNom()%><br>
                                Date de sortie : <%= film.getDate_de_sortie()%><br>
                                Durée : <%= film.getDuree()%><br>
                                Couleur : <%= film.getCouleur()%><br>
                                MPAA : <%= film.getMpaa()%><br>
                                Genre : <%= film.getGenre()%><br>
                                Acteur : <%= film.getActeur()%><br>
                                Producteur : <%= film.getProducteur()%><br>
                                Maison de production : <%= film.getMaisonProduction()%><br>
                                Qualité : <%= film.getQualite()%>
                            </td>
                        </tr>
    				</table>
                    <br>
     
            <%
                }
            %>
        </div>
    et la servlet

    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
     protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
     
            ServletOutputStream sos = response.getOutputStream();
            try 
            {
                filmManagementBean bFilm = (filmManagementBean) request.getSession().getAttribute("bFilm");
                int index = (Integer)request.getSession().getAttribute("numFilm");
                ListFilms lFilm = bFilm.getListSeance();
     
                response.setContentType("image/jpeg");
     
                sos.write(lFilm.getFilm(index).getAffiche());
                sos.flush();
                sos.close();
            }
            catch (IOException iOException) {
     
                System.out.println("filmToStream IOException ["+iOException+"]");
                iOException.printStackTrace(System.out);
     
            }
     
     
        }

  11. #11
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    La servlet est mappée en /filmToStream ?

    Dans l'absolu, si la liste des films se trouve en session, il faudrait juste passer à la servlet l'indice dans la liste, un peu comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for(int i=0; i < films.getSize(); i++)
    {
        film = films.getFilm(i);
        session.setAttribute("numFilm", i);
    %>
        <table width="397" border="1" class="tableFilm">
        <tr>
            <td width="97" height="146" class="tdFilm">
                <img src="./filmToStream?numFilm=<%=i%>" alt=""/>
            </td>
    ...
    et au niveau de la servlet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    String num = request.getParameter("numFilm");
    if (num != null)
    {
        Film film = ((List)request.getSession().getAttribute("MaListe")).get(Integer.parseInt(num));
        etc...
    }
    Sinon, je pense que tu passes plusieurs fois dans ta servlet mais tu ne récupère qu'une seule image (puisque tu ne précises aucun paramètre à la servlet)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 126
    Par défaut
    Nickel merci beaucoup çà marche du tonnerre comme çà!!!

    Je m'en vais de ce pas cliquer sur Résolu !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. afficher une image(blob) Mysql
    Par biba158 dans le forum JDBC
    Réponses: 2
    Dernier message: 07/05/2007, 12h32
  2. Blob mysql et PHP
    Par manu51_7 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 12/12/2006, 21h39
  3. Réponses: 19
    Dernier message: 21/01/2006, 13h23
  4. c# et les blob MySQL
    Par marsufunky dans le forum Windows Forms
    Réponses: 3
    Dernier message: 17/11/2005, 10h26
  5. [D 2005]ADO et blob MySql
    Par EFCAugure dans le forum Bases de données
    Réponses: 1
    Dernier message: 24/02/2005, 08h52

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