Recuper image blob

MedL
Messages postés
9
Date d'inscription
mardi 20 septembre 2016
Dernière intervention
14 octobre 2016
- 20 sept. 2016 à 15:27 - Dernière réponse : KX
Messages postés
15821
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
14 novembre 2018
- 22 sept. 2016 à 23:11
comment recuperer une image blob (mysql) dans ma jsp ?
je ne peut pas trouver l'erreur:

servlet:
while(rs.next()){
     // "1" because the blob is the only field retrieved by the query : 
     /*Blob blob = rs.getBlob(6);
     InputStream in = blob.getBinaryStream();
     Image image = ImageIO.read(in);
       return image;
          je peut utuliser ca seulment ?*/
    byte[] bytes = rs.getBytes(1);
    Image img = Toolkit.getDefaultToolkit().createImage(bytes);
    ImageIcon icon = new ImageIcon(img); 
    return icon;
}
.....................
request.setAttribute("form", form);
.......

jsp:
<% Animales animale = (Animales) request.getAttribute("animale");

 out.println(animale.getImg1()+"<img src='"+animale.getImg1()+"' width='60' height='60'/>");
%>
Afficher la suite 

Votre réponse

8 réponses

KX
Messages postés
15821
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
14 novembre 2018
- 20 sept. 2016 à 22:06
0
Merci
Bonjour,

<img src='toto'>
ne fonctionne que si
'toto'
est le nom d'un fichier accessible depuis la page web, mais si
animale.getImg1()
retourne un objet java.awt.Image ça ne peut pas marcher, il faudrait enregistrer cette image dans un fichier temporaire, et mettre dans
<img src
le lien vers ce fichier.

Alternative : au lieu d'enregistrer les bits de tes images en Blob en base de données, tu pourrais les enregistrer en Clob avec un format en Base64 que tu pourrais mettre tel quel dans ta page web.

<img src='data:image/png;base64,...' width='60' height='60'/>

Voir aussi les classes Base64.Encoder et Base64.Decoder
Commenter la réponse de KX
MedL
Messages postés
9
Date d'inscription
mardi 20 septembre 2016
Dernière intervention
14 octobre 2016
- 21 sept. 2016 à 11:25
0
Merci
merci pour votre reponse ,
mais encore j'ai un petite prblm
quand je recuperer le chemine de l'image j'ai met dans une obj
servlet:
Map map.put("chemin",chemin);
et dans la jsp j'utulise JSTL pour recuperer et j'ai réussi
mais le seule prblm et dans la balise <img....>comme se suit:
jsp :
<img src=${form.map['chemin']}/nom_img.jsp>
//pas d'affichage
malgrer ca ${form.map['chemin']} et le real chemin
merci d'avvance
MedL
Messages postés
9
Date d'inscription
mardi 20 septembre 2016
Dernière intervention
14 octobre 2016
- 22 sept. 2016 à 20:47
salut,j'espair que j'ai pas donnée un bonne explication a mon prblm
voila la methode qui recuperer l'image de bdd,soit type blob ou byte comme je veut :
public class RetriveImg {
public Animales retriveImg(HttpServletRequest request,String paht_servlet)
            throws ClassNotFoundException, IOException {

Forum_animals form = new Forum_animals();
        String id_user = form.id_user_qeyre(email_origine);//recuperer            //id_user 
        Animales animale = new Animales();
 try { 
         
        
          Blob b=  retrieveImageByID(id_user,paht_servlet+"imgBDD");
          animale.setIg(b);
        } catch (Exception e) {
            erreurs.put("err_img", e.getMessage());
        }
      
       
        return animale;
    }

 private Blob retrieveImageByID(String id_user_fk,String path_) throws Exception {
        if (id_user_fk == null) {
            throw new Exception("DBPicker: can not retrieve an image with part's ID null");

        } else {
            String url = "jdbc:mysql://localhost:3308/BDD_ANIMALES";
            String utilisateur = "utilisateur ";
            String motDePasse = "motDePasse ";
            
            Connection connexion = null;
            String sql = "select  image_animale from animale where id_user_fk= '" + id_user_fk + "' ;";
            
            OutputStream os = null;
            
            Blob image = null;
          
            byte[] imgdata = null;
            try {
                Class.forName("com.mysql.jdbc.Driver");
                connexion = DriverManager.getConnection(url, utilisateur, motDePasse);
                Statement statement = connexion.createStatement();
                ResultSet rs = statement.executeQuery(sql);

                int i = 0;
                while (rs.next()) {
                    
                    image = rs.getBlob(1);
                    imgdata = image.getBytes(1, (int) image.length());
                    os = new FileOutputStream(path_+"/" + i + ".jpg");
                    
                    os.write(imgdata);
                    i++;
                    
                    return image;
                }
                    os.flush();
                    os.close();
                    
            } catch (ClassNotFoundException | SQLException ex) {
            }

            throw new Exception(h + "DBPicker: Warning, image with part's ID : " + id_user_fk + " can not be loaded");

        }
    }
}

ensuite dans ma servlet j'ai recupere les donner et envoyer ver jsp:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException, ClassNotFoundException {
        response.setContentType("text/html;charset=UTF-8");
        //------------------------------------------------------------------
        RetriveImg form=new RetriveImg();
        Animales animale =form.retriveImg(request,getServletContext().getRealPath("/").replace('\\', '/'));
        request.setAttribute("form", form);
        request.setAttribute("animale", animale);
        
        //------------------------------------------------------------------
        
        this.getServletContext().getRequestDispatcher("/MesAnnonces.jsp").forward(request, response);
        
       
    }

<img src=${pageContext.servletContext.getRealPath("/").replace("\\", "/")}"0.jpg" alt="">

donc j'ai réussi a recuperer les image depuis bdd (mysql) et de copier sur le path de webapp mais pas ou meme path de jsp
donc quelle est la solution pour affichier l'image dans jsp.
KX
Messages postés
15821
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
14 novembre 2018
- 22 sept. 2016 à 22:02
Je ne vois pas l'intérêt de mettre ton image en base de donnée (rapide) si au moment de la traiter tu dois l'enregistrer en fichier sur le disque (lent).

Pour moi, le mieux est d'avoir une deuxième servlet, qui lit l'URL /getImage/12345 va lire le Blob 12345 en base de donnée pour afficher l'image

Ensuite dans ta JSP tu ne t'occupes pas d'afficher l'image, mais tu mets juste le lien vers la servlet d'image
<img src='/getImage/12345'

Lors de l'affichage de la JSP le navigateur va aller chercher chaque image en suivant les liens.

Exemple :

<?xml version="1.0"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <servlet>
        <servlet-name>ImageServlet</servlet-name>
        <servlet-class>ccm.kx.ImageServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ImageServlet</servlet-name>
        <url-pattern>/getImage</url-pattern>
    </servlet-mapping>
</web-app>

public class ImageServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            String name = getName(request.getRequestURI());
            byte[] bytes = loadImage(name);
            response.getOutputStream().write(bytes);
        } catch (SQLException e) {
            Logger.getGlobal().log(Level.WARNING, request.getRequestURI(), e);
        }
    }

    private String getName(String uri) {
        String[] paths = uri.split("/");
        return paths[paths.length - 1];
    }

    private byte[] loadImage(String name) throws SQLException {
        // ...
        Blob blob = rs.getBlob(1);
        return blob.getBytes(1, (int) blob.length());
    }
}

<!DOCTYPE html>
<html>
<head>
    <title>Images</title>
</head>
<body>
    <img src='getImage/IMG123.jpg'></img>
    <img src='getImage/IMG456.jpg'></img>
    <img src='getImage/IMG789.jpg'></img>
</body>
</html>
Troydz1
Messages postés
4
Date d'inscription
mercredi 21 septembre 2016
Dernière intervention
16 avril 2017
> KX
Messages postés
15821
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
14 novembre 2018
- 22 sept. 2016 à 22:37
merci pour votre aide
Troydz1
Messages postés
4
Date d'inscription
mercredi 21 septembre 2016
Dernière intervention
16 avril 2017
> KX
Messages postés
15821
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
14 novembre 2018
- 22 sept. 2016 à 23:01
IMG123.jpg.....comment je recuperer ce nom
KX
Messages postés
15821
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
14 novembre 2018
> Troydz1
Messages postés
4
Date d'inscription
mercredi 21 septembre 2016
Dernière intervention
16 avril 2017
- 22 sept. 2016 à 23:11
C'est ce que j'ai fait dans la méthode getName.

La servlet reçoit l'URL complète, on en garde que la dernière partie "IMG123.jpg" dont on se sert comme identifiant pour requêter en base de données.

PS. J'ai testé le code vite fait, c'est juste un exemple pour illustrer l'idée de séparer le traitement de la JSP d'une part et des images d'autres part.
Commenter la réponse de MedL

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.