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

JSF Java Discussion :

[MyFaces] Afficher une image stockée en DB


Sujet :

JSF Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 24
    Par défaut [MyFaces] Afficher une image stockée en DB
    Bonjour,

    J'utilise MyFaces et JPA. J'ai des photos stockées dans un DB et je retire ces infos grâce à JPA. J'ai donc un bean avec un champ byte[] qui contient la photo.

    Je voudrais afficher cette photo dans une page HTML mais je ne vois pas comment faire. J'ai découvert <s:graphicImageDynamic> mais je ne comprend pas le fonctionnement.

    Peut-être que je dois créer une servlet mais je ne sais pas comment m'y prendre pour la définir.

    Pourriez-vous m'aider ?

    Merci

  2. #2
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Bonjour,
    Personellement, je passes par le composant <a4j:mediaOutput>.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 24
    Par défaut
    Et je peut utiliser ça avec myfaces ?

    Merci pour la réponse

  4. #4
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Tout à fait, c'est un jeu de composants (ajax4jsf/Richfaces), qui peut fonctionner avec Sun JSF RI ou MyFaces

    http://labs.jboss.com/file-access/de...uirements.html

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 24
    Par défaut
    Voilà, j'ai mis en place ajax4jsf (avec RichFaces). Après avoir pris mon temps pour ne plus avoir d'erreur, je me retrouve sur un dernier problème (mais de taille) :

    L'image ne s'affiche pas alors que lorsque je regarde la source, je vois les data.

    Peut-être dois-je ajouter quelque chose dans le web.xml pour les images ?

    Dans ma jsp:
    <a4j:mediaOutput element="img" cacheable="false" session="true"
    createContent="#{vCardController.paint}" value="#{card.photo}"
    mimeType="image/jpeg" />
    dans mon controller :
    public void paint(OutputStream out, Object data) throws IOException {

    if (data != null && data instanceof byte[]) {
    byte[] paintData = (byte[]) data;
    BufferedImage img = new BufferedImage(25, 25, BufferedImage.TYPE_INT_RGB);
    Graphics2D graphics2D = img.createGraphics();
    graphics2D.drawBytes(paintData, 0, paintData.length, 0, 0);
    ImageIO.write(img, "jpeg", out);
    }
    }
    L'image est stockée sous forme de blob (que je récupère dans un POJO JPA.

    Une idée ?

    Merci pour le coup de main.

  6. #6
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Bonjour,
    Normalement, le problème est signalé dans le log de ton application, et ça nous aiderait énormément si tu l'avais posté

    A defaut de ça, je vais essayer de deviner ...
    A vue de nez, ça vient du fait que tu passes le blob dans l'attribut value, or, ajax4jsf va encoder ce value dans l'URL ça va pas le faire, l'URL est limité en longueur, est ton blob passera pas.

    La solution serait de passer plutôt un autre champ plus petit en taille et qui permet de retrouver le blob en question .... wait for it ... le candidat idéal est bien sûr l'identifiant de l'image dans la base de données

    Donc, tu passes plutôt l'id dans value (value="#{card.id}"), et dans ta méthode pain, tu castes data vers Long (ou ton type d'id), tu retrouves le blob de la base de donnés, et le reste tu l'as déjà fait.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 24
    Par défaut
    Bonjour,

    je n'ai aucun message d'erreur dans mon log et ça me trouble aussi

    Mais je vais essayer ta solution.

    Merci

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 24
    Par défaut
    Effectivement, maintenant j'ai une améliration.
    J'ai créé une classe ImageEntity qui contient l'image et j'y fais référence via un id.

    Une image s'affiche mais il s'agit d'un carré noir à la place de mon image.

    Voici le code de la méthode paint : (l'image enregistrée est un gif)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        public void paint(OutputStream out, Object data) throws IOException {
     
            ImageDao doa = new ImageDao();
            if (data != null) {
                ImageEntity ie = doa.findById((Long)data);
                byte[] paintData = (byte[]) ie.getPhoto();
                BufferedImage img = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
                Graphics2D graphics2D = img.createGraphics();
                ImageIcon image = new ImageIcon(paintData);
                graphics2D.drawImage(img, 0, 0, null);
                ImageIO.write(img, "gif", out);
            }
        }
    Une idée ?

    Merci

  9. #9
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Bonjour,
    Je te propose ceci: tester ceci dans une application Java SE (avec le main), histoire d'isoler le problème (est ce un problème de transport, ou dans le format de l'image dans la DB, etc.)

    Danc tu crées un JFrame, et tu redéfinies sa méthode paint, en castant le paramètre Graphics en Graphics2D, et tu y appliques le même traitement que tu fais déjà.

    Essaies aussi d'ajouter log4j.jar + log4j.properties à ton projet si c'est pas déjà le cas, ça te donnera peut être plus de détails.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 24
    Par défaut
    J'ai posté un peu trop vite le code qui est incorrect.
    Si on le lit, on peut voir que je ne fais rien avec mon image.
    Le problème est que je ne sais pas encore dessiner une image existante dans un graphics2D mais j'étudie la question.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 24
    Par défaut
    Après un peu de reflection sur l'API, j'ai enfin réussi à écrire les images :
    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
     
       public void paint(OutputStream out, Object data) throws IOException {
     
            ImageDao doa = new ImageDao();
            if (data != null) {
                ImageEntity ie = doa.findById((Long)data);
                byte[] paintData = (byte[]) ie.getPhoto();
     
                ByteArrayInputStream b = new ByteArrayInputStream(paintData, 0, paintData.length); 
                BufferedImage img = ImageIO.read(b);
     
                Graphics2D graphics2D = img.createGraphics();
     
                graphics2D.drawImage(img, null, null);
     
                ImageIO.write(img, "gif", out);
            }
        }
    Mais mon nouveau problème est que l'image n'est pas redimensionnée.
    Je vais voir comment faire cela ou si quelqu'un l'a déjà fait ce serait sympa de m'aider. Je mets ce post en résolu.

    Merci pour le coup de main.

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

Discussions similaires

  1. [MySQL] Afficher une image stocké en base données
    Par Blo0d4x3 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 19/06/2006, 17h02
  2. [MySQL] Afficher une image stockée dans une base de données
    Par LuckySoft dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 22/04/2006, 12h57
  3. Afficher une image stockée en memoire
    Par romeo9423 dans le forum MFC
    Réponses: 5
    Dernier message: 29/07/2005, 23h00
  4. [Forms] Afficher une image stockée en base
    Par oramine dans le forum Forms
    Réponses: 12
    Dernier message: 01/02/2005, 14h14
  5. Afficher une image stockée dans interbase
    Par NicolasR dans le forum Bases de données
    Réponses: 2
    Dernier message: 01/06/2004, 10h00

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