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 :

Afficher plusieurs images d'une BDD MySql


Sujet :

Servlets/JSP Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 106
    Par défaut Afficher plusieurs images d'une BDD MySql
    Bonjour,

    En JEE, j'arrive à afficher des images dans la 1ère colonne, mais pas dans les autres. Je ne comprends pas trop pourquoi ! (J'ai un profil JUNIOR en dév).
    Je vais mettre le code de ma servlet ainsi que de ma classe DaoImpl.

    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
    26
    27
    if (path.equals("/image")) {
     
    			String uri = request.getRequestURI();
    			int index = uri.lastIndexOf("/");
    			String imageName = uri.substring(index + 1, uri.length());
     
    			try {
     
    				Blob imageEnBdds = metier.affImg(imageName); /* La méthode pr l'affichage des images est de type Blob */
     
    				if (imageEnBdds.length() >= 1) {
     
    					byte[] imageData = imageEnBdds.getBytes(1, (int) imageEnBdds.length());
     
    					response.setContentType("image/png");
    					OutputStream o = response.getOutputStream();
    					o.write(imageData);
    					o.flush();
    					o.close();
     
    				}
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			System.out.println(imageName);
    		}
    DaoImpl :

    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
    public java.sql.Blob affImg(String img1) {
     
    		Connection connection = ConnexionBDD.getConnection();
    		java.sql.Blob blob = null; /* A la base qu'une ligne */
     
    		try {
    			PreparedStatement ps = (PreparedStatement) connection.prepareStatement(
    					"SELECT img1,img2,img3,img4,img5 FROM bsolutionwithimg WHERE bsolutionwithimg.bsolution1 LIKE ? ");
     
    			ps.setString(1, img1);
     
    			ResultSet rs = ps.executeQuery();
    			while (rs.next()) {
    				// ORM
    				blob = rs.getBlob("img1");
    				/*
    				 * blob2 = rs.getBlob("img2"); blob3 = rs.getBlob("img3"); blob4 =
    				 * rs.getBlob("img4"); blob5 = rs.getBlob("img5");
    				 */
     
    				/*
    				 * Il me retourne qu'une seule image -> img1, je crée un blob total ?!
    				 * blobGeneral = rs .getBlob("img1" + blob + "img2" + blob2 + "img3" + blob3 +
    				 * "img4" + blob4 + "img5" + blob5);
    				 */
     
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
     
    		return blob;
    		// return blobGeneral;
    J'ai mis une capture d'ecran pour que vous ayez un visuel

    Nom : Capture-Ecran.png
Affichages : 796
Taille : 121,0 Ko

    Auriez-vous une idéé ?

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Dans l'url, tu peux ajouter un paramètre qui permet de sélectionner la "colonne".

    Dans le principe, par exemple, là où actuellement tu as <img src=".../image/imagename">, tu pourrais écrire <img src=".../image/imagename/1> pour obtenir l'image de la première colonne et <img src=".../image/imagename/2> pour celle de la deuxième.

    Dans la servlet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int index = uri.lastIndexOf("/");
    String imageIndex = uri.substring(index + 1);
    int index2 = uri.lastIndexOf("/",index-1);
     
    String imageName = uri.substring(index2 + 1, index);
     
    			try {
     
    				Blob imageEnBdds = metier.affImg(imageName, imageIndex); /* La méthode pr l'affichage des images est de type Blob */
    et enfin
    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 java.sql.Blob affImg(String img1, String n) {
     
                    String imgCol = "img" + n;
     
    		Connection connection = ConnexionBDD.getConnection();
    		java.sql.Blob blob = null; /* A la base qu'une ligne */
     
    		try {
    			PreparedStatement ps = (PreparedStatement) connection.prepareStatement(
    					"SELECT " + imgCol + " FROM bsolutionwithimg WHERE bsolutionwithimg.bsolution1 LIKE ? ");
     
    			ps.setString(1, img1);
     
    			ResultSet rs = ps.executeQuery();
    			while (rs.next()) {
    				// ORM
    				blob = rs.getBlob(imgCol);
    Sinon je vois bien une solution qui permettrait de charger les 5 images d'un coup, mais qui serait plutôt complexe pour un débutant.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 106
    Par défaut Réponse aux commentaires
    Merci pour ta réponse.

    Je viens de tester les modifications que tu m'a indiqué mais j'ai une erreur de type "java.lang.NullPointerException"
    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
    else if (path.equals("/image")) {
     
    			String uri = request.getRequestURI();
    			int index = uri.lastIndexOf("/");
    			// String imageName = uri.substring(index + 1, uri.length());
    			String imageIndex = uri.substring(index + 1);
    			int index2 = uri.lastIndexOf("/", index - 1);
     
    			String imageName = uri.substring(index2 + 1, index);
     
    			try {
     
    				Blob imageEnBdds = metier.affImg(imageName, imageIndex);
     
    				if (imageEnBdds.length() > 1) {
     
    					byte[] imageData = imageEnBdds.getBytes(1, (int) imageEnBdds.length());
    					/*
    					 * Ci-dessous, rajout pr test affichage colonne 2 pour img2 ----------> Ca
    					 * fontionne pas , même img1 n'est plus affiché
    					 */
    					// byte[] imageData2 = imageEnBdds.getBytes(2, (int) imageEnBdds.length());
     
    					response.setContentType("image/png");
    					OutputStream o = response.getOutputStream();
    					o.write(imageData);
    					o.flush();
    					o.close();
     
    				}
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			System.out.println(imageName);
    		}
    En fait l'erreur est sur cette ligne : if (imageEnBdds.length() > 1) Je ne vois pas pourquoi. J'ai essayé avec >=, mais ça ne fonctionne pas non plus.
    Je rajoute le code ma page 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
    <c:forEach items="${model.brackets}" var="b"> <!-- items="${model.brackets}  -->
     
    				<tr>
    					<td>${b.area}</td> 
    					<td>${b.position}</td> 
    					<td>${b.elecroute}</td>	 				
    					<td>${b.bsolution1}</td> <!-- ${b.img1} ci-dessous  -->
    					<td><input type="checkbox" name="BS1" id="BS1" />
    						<label for="BS1"></label></td>
    					<td><img src="image/${b.bsolution1}" width="160px" height="100px"/></td>  <!-- Initialement : width="220px" height="140px -->
    					<td>${b.name1}</td>				
    					<td>${b.bsolution2}</td> 
    					<td><input type="checkbox" name="BS2" id="BS2" />
    						<label for="BS2"></label></td>
    					<td><img src="image/${b.bsolution2}" width="160px" height="100px"/></td>
    					<td>${b.name2}</td>				
    					<td>${b.bsolution3}</td> 
    					<td><input type="checkbox" name="BS3" id="BS3" />
    						<label for="BS3"></label></td>
    					<td><img src="image/${b.bsolution3}" width="160px" height="100px"/></td>
    					<td>${b.name3}</td>				
    					<td>${b.bsolution4}</td> 
    					<td><input type="checkbox" name="BS4" id="BS4" />
    						<label for="BS4"></label></td>
    					<td><img src="image/${b.bsolution4}" width="160px" height="100px"/></td>
    					<td>${b.name4}</td>
    					<td>${b.bsolution5}</td> 
    					<td><input type="checkbox" name="BS5" id="BS5" />
    						<label for="BS5"></label></td>
    					<td><img src="image/${b.bsolution5}" width="160px" height="100px"/></td>
    					<td>${b.name5}</td>	
    					<!-- <td>${b.refPart}</td> -->				
    					<td>${b.partsRef1}</td>
    					<td>${b.partsRef2}</td>	
    					<td>${b.partsRef3}</td>	
    					<td>${b.partsRef4}</td>	
    					<td>${b.partsRef5}</td>	
    					<td>${b.partsRef6}</td>	
    					<td>${b.partsRef7}</td>						
    				</tr>
     
    			</c:forEach>
    			</tbody>
    			</table>
    J'ai aussi essayer ça dans le code de la servlet , fonctionne pas :
    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
    @Override
    	public java.sql.Blob affImg(String param) {
     
    		Connection connection = ConnexionBDD.getConnection();
    		java.sql.Blob blob = null; /* A la base qu'une ligne */
     
    		// Blob image1 = null;
     
    		try {
    			PreparedStatement ps = (PreparedStatement) connection.prepareStatement(
    					"SELECT img1,img2,img3,img4,img5 FROM bsolutionwithimg WHERE bsolutionwithimg.bsolution1 LIKE ? ");
     
    			/* Teste avec la même requête que la 1ère méthode */
     
    			ps.setString(1, param);
     
    			ResultSet rs = ps.executeQuery();
    			while (rs.next()) {
    				Brackets brackets = new Brackets();
    				brackets.setImg1((Blob) rs.getBlob("img1"));
    				brackets.setImg2((Blob) rs.getBlob("img2"));
    				brackets.setImg3((Blob) rs.getBlob("img3"));
    				brackets.setImg4((Blob) rs.getBlob("img5"));
    				brackets.setImg5((Blob) rs.getBlob("img5"));
     
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
     
    		return blob;
    		// return blobGeneral;
     
    	}

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Si tu as une NPE sur if (imageEnBdds.length() > 1), c'est imageEnBdds est null, donc que probablement la requête ne trouve aucun enregistrement pour le nom d'image.

    Et ça ne sert à rien de chercher à faire un conteneur de blobs, puisque tu ne pourras rien en faire directement pour coller une url dans l'attribut src des images ! La seule solution pour récupérer les 5 blobs en même temps (en une requête) et les coller dans des src, c'est de les mettres à la suite dans le flux de la réponse, avec en entête un moyen de les séparer (les offsets), d'utiliser une requête ajax pour lire le flux, de faire des tableaux d'octets JavaScript, un par "blob", pour recréer des urls vers ces tableaux pour les coller dans l'attribut src de chaque img.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 106
    Par défaut Réponse aux commentaires
    Le truc c'est que imageEnBdds n'est pas null pour la 1ère colonne ! Il est null pour les autres et c'est ça que je ne comprends pas !!
    Pourquoi pour bsolution1 j'ai une image correspondante, et pas pour bsolution2->5 ?

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Au niveau du modèle, tu as une table dont les lignes ont 5 champs d'images et un champ de nom à priori, vu ta requête. Est-ce que les 5 images sont bien censés avoir le même nom ? Parce que si tu ne trouves pas d'image img2 pour un nom alors qu'il y a une img1 pour ce nom, c'est que le champ img2 est vide, sinon, la seule raison que je vois, c'est que le nom n'est pas le même dans la requête, et là, aucune garanti que si tu as un img1 pour "nom1", tu auras un img2 pour "nom2", évidemment.
    Sinon, c'est le modèle qui n'est pas bon.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

Discussions similaires

  1. Récupérer/Afficher images d'une BDD MySQL au survol d'un lien
    Par fredbubu65 dans le forum Développement Web en Java
    Réponses: 1
    Dernier message: 28/05/2018, 10h31
  2. [MySQL] Récupération d'une image dans une BDD mySQL
    Par jojojo84 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 21/12/2010, 16h34
  3. [Débutant] comment afficher plusieurs images dans une interface
    Par zakary dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 02/05/2009, 10h47
  4. [Débutant] comment afficher plusieurs images dans une seule interface ?
    Par youssa81 dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 06/02/2009, 00h36
  5. Comment afficher plusieurs images depuis une BD en même temps ?
    Par thibouille dans le forum Bases de données
    Réponses: 2
    Dernier message: 06/11/2007, 15h36

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