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

  1. #1
    Nouveau membre du Club
    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
    Points : 27
    Points
    27
    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 : 749
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
    Points : 29 131
    Points
    29 131
    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.

  3. #3
    Nouveau membre du Club
    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
    Points : 27
    Points
    27
    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
    Points : 29 131
    Points
    29 131
    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.

  5. #5
    Nouveau membre du Club
    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
    Points : 27
    Points
    27
    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
    Points : 29 131
    Points
    29 131
    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.

  7. #7
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonjour,

    imageEnBdds est toujours null parce que la méthode affImg retourne toujours null.
    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 */ // ICI TU L'INITIALISES AVEC NULL
     
    		// 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; ICI TU LE RETOURNES SANS L'AVOIR AFFECTÉE UNE VALEUR
    		// return blobGeneral;
     
    	}
    Ensuite la variable brackets dans ta boucle ne sert à rien. Il faut aussi tester la variable s'il est null ou non avant de l'utiliser.
    Mettre des images dans une BD coûte très cher en ressource, upload les dans une répertoire et sauvegarde leur nom dans la base.

    A+.

  8. #8
    Nouveau membre du Club
    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
    Points : 27
    Points
    27
    Par défaut Réponse aux commentaires
    Citation Envoyé par joel.drigo Voir le message
    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.
    ---> Chaque image a sa propre image et son propre nom. En fait, dans ma JSP dans mon label, je tape justement une référence qui a 4 images avec donc 4 noms associés. Je te mets le modèle que j'ai écris. (Pour moi le modèle communique avec ma JSP concernant mes 4 filtres dans lesquels je tape des choses !? Setters/Getters)
    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
    private String motCleArea;
    	private String motClePosition;
    	private String motCleElecRoute;
    	private String motCleBsolution1;
     
    	private String total = motCleArea + motClePosition + motCleElecRoute + motCleBsolution1;
     
    	private List<Brackets> brackets = new ArrayList<Brackets>();
     
    	// Getters & Setters
     
    	public String getMotCleArea() {
    		return motCleArea;
    	}
     
    	public void setMotCleArea(String motCleArea) {
    		this.motCleArea = motCleArea;
    	}
     
    	public List<Brackets> getBrackets() {
    		return brackets;
    	}
     
    	public void setBrackets(List<Brackets> brackets) {
    		this.brackets = brackets;
    	}
     
    	public String getMotClePosition() {
    		return motClePosition;
    	}
     
    	public void setMotClePosition(String motClePosition) {
    		this.motClePosition = motClePosition;
    	}
     
    	public String getMotCleElecRoute() {
    		return motCleElecRoute;
    	}
     
    	public void setMotCleElecRoute(String motCleElecRoute) {
    		this.motCleElecRoute = motCleElecRoute;
    	}
     
    	public String getTotal() {
    		return total;
    	}
     
    	public void setTotal(String total) {
    		this.total = total;
    	}
     
    	public String getMotCleBsolution1() {
    		return motCleBsolution1;
    	}
     
    	public void setMotCleBsolution1(String motCleBsolution1) {
    		this.motCleBsolution1 = motCleBsolution1;
    	}

  9. #9
    Nouveau membre du Club
    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
    Points : 27
    Points
    27
    Par défaut Réponse aux commentaires
    Citation Envoyé par andry.aime Voir le message
    Bonjour,

    imageEnBdds est toujours null parce que la méthode affImg retourne toujours null.


    Ensuite la variable brackets dans ta boucle ne sert à rien. Il faut aussi tester la variable s'il est null ou non avant de l'utiliser.
    Mettre des images dans une BD coûte très cher en ressource, upload les dans une répertoire et sauvegarde leur nom dans la base.

    A+.
    ----> Effectivement tu as raison ! En fait, j'affectte blob dans le try mais apparemment cette solution ne fonctionne pas. En fait, je me suis aperçu aussi que si je mets :
    blob = rs.getBlob("img1");
    blob = rs.getBlob("img2");
    Il n'y a qu'une ligne sur deux qui s'affiche ?!!! Je ne vois pas pourquoi. Si t'a une idée. Est ce que le fait de déclarer "blob = rs.getBlob("img1")" dans le try est pris en compte ? As tu une idée pour afficher les autres images des autres colonnes ?

  10. #10
    Nouveau membre du Club
    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
    Points : 27
    Points
    27
    Par défaut Réponse aux commentaires
    Je remet le code de mon DAOImpl et celui de ma servlet pour que les choses redeviennent claire.
    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
    public java.sql.Blob affImg(String param) {
     
    		Connection connection = ConnexionBDD.getConnection();
    		java.sql.Blob blob = null; 
     
    		try {
    			PreparedStatement ps = (PreparedStatement) connection.prepareStatement(
    					"SELECT img1,img2,img3,img4,img5 FROM bsolutionwithimg WHERE bsolutionwithimg.bsolution1 LIKE ? ");
     
    			ps.setString(1, param);
     
    			ResultSet rs = ps.executeQuery();
    			while (rs.next()) {
     
    				blob = rs.getBlob("img1");
     
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
     
    		return blob;
     
    	}
    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
    else 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() >= 0) { /* Erreur sur cette ligne, il n'aime pas >1 ou >=1 ou >0 */
     
    					byte[] imageData = imageEnBdds.getBytes(1, (int) imageEnBdds.length());
     
    					response.setContentType("image/png"); /* image/png ----image/ ---> Ne change rien */
    					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);

  11. #11
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par fredbubu65 Voir le message
    ---> Chaque image a sa propre image et son propre nom.
    Du coup, tu es obligé de faire une requête dont les deux champs sont différents :

    • "SELECT img1 FROM bsolutionwithimg WHERE bsolutionwithimg.bsolution1 LIKE ? ");.
    • "SELECT img2 FROM bsolutionwithimg WHERE bsolutionwithimg.bsolution2 LIKE ? ");.
    • "SELECT img3 FROM bsolutionwithimg WHERE bsolutionwithimg.bsolution3 LIKE ? ");.
    • soit "SELECT img" + index + " FROM bsolutionwithimg WHERE bsolutionwithimg.bsolution" + index + " LIKE ? ");.



    Et ton modèle n'est pas normalisé : pourquoi avoir mis 5 images et 5 noms dans chaque ligne, au lieu d'une image et un nom par ligne (de table en base je veux dire) ? Et si les images sont associés entre elles, tu peux toujours le faire. Et la classe de ton modèle peut regrouper.

    Citation Envoyé par fredbubu65 Voir le message
    En fait, dans ma JSP dans mon label, je tape justement une référence qui a 4 images avec donc 4 noms associés. Je te mets le modèle que j'ai écris. (Pour moi le modèle communique avec ma JSP concernant mes 4 filtres dans lesquels je tape des choses !? Setters/Getters)
    4 ou 5 images ? Et je ne vois que 3 string, laquelle ou lesquelles correspondent au nom de l'image ? Pourquoi une liste de Bracket ? D'après le dernier code que tu montres un Bracket contient 5 images. Ta classe contient une liste de Brackets. Donc une liste de groupe de 5 images ?

    Si tu veux passer par ta classe, tu peux toujours récupérer ton image en cherchant l'instance (faire la requête que tu as faite) de cette classe qui correspond au mot cherché et en prendre l'image qui se trouve à l'index voulu dans l'un des Bracket. Selon le lien que tu fais entre ces différentes informations dans ta classe.

  12. #12
    Nouveau membre du Club
    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
    Points : 27
    Points
    27
    Par défaut Réponse aux commentaires
    Je comprends pas trop ce que tu veux dire ! Je vais essayer de résumer ce que j'ai fais :
    Mon modele : 4 attributs + Getters/Setters ---> Eux prennent en compte ce que l'utilisateur tapera dans les labels
    Mon DaoImpl : Implemente ma méthode pour l'affichage des images. Cette méthode est utilisée dans ma servlet.
    Ma Servlet : Utilise blob pour l'affichage des images.

    En fait, sur 1 ligne dans ma table en BDD, je peux avoir entre 1 et 5 images(avec leurs noms & autre) :

    Nom : MaTableEnBDD.png
Affichages : 680
Taille : 96,3 Ko

  13. #13
    Nouveau membre du Club
    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
    Points : 27
    Points
    27
    Par défaut Réponse aux commentaires
    En fait, j'ai essayé dans mon DaoImpl mais ça ne 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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    public java.sql.Blob affImg(String param) {
     
    		Connection connection = ConnexionBDD.getConnection();
    		java.sql.Blob blob = null; /* A la base qu'une ligne */
     
    		List<Blob> listeImg = new ArrayList<Blob>();
     
    		/*
    		 * J'initialse 'blob' à null, mais je ne recupère rien de la BDD, et je retourne
    		 * donc null à la fin !!!
    		 */
     
    		try {
    			PreparedStatement ps = (PreparedStatement) connection.prepareStatement(
    					"SELECT * FROM bsolutionwithimg AS b WHERE b.bsolution1 LIKE ?"); /* FONCTIONNE AUSSI */
    			// "SELECT img1,img2,img3,img4,img5 FROM bsolutionwithimg AS b WHERE
    			// b.bsolution1 LIKE ? ");
     
    			ps.setString(1, param);
     
    			ResultSet rs = ps.executeQuery();
    			while (rs.next()) {
     
    				Brackets brack = new Brackets();
    				brack.setImg1((Blob) rs.getBlob("img1"));
    				brack.setImg2((Blob) rs.getBlob("img2"));
    				brack.setImg2((Blob) rs.getBlob("img3"));
    				brack.setImg2((Blob) rs.getBlob("img4"));
    				brack.setImg2((Blob) rs.getBlob("img5"));
     
    				// blob = rs.getBlob("img1");
    				Blob img1 = null;
    				Blob img2 = null;
    				Blob img3 = null;
    				Blob img4 = null;
    				Blob img5 = null;
     
    				listeImg.add(1, img1);
    				listeImg.add(2, img2);
    				listeImg.add(3, img3);
    				listeImg.add(4, img4);
    				listeImg.add(5, img5);
     
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
     
    		return (java.sql.Blob) listeImg;
    		// return listeImg; -> Ne fonctionne pas, je dois retourner un type Blob
    	}

  14. #14
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Je vais risquer une remarque d'ordre général : ta structure de base est visiblement bancale.

    Ce qu'il te faudrait, c'est une table Image avec une colonne nom et une colonne blob (et éventuellement un id auto-incrémenté), et une table à part qui associe les images ensembles (je suppose qu'il y a quelque chose qui regroupe les images ensembles par ligne). Comme ça, tu pourrais avoir un DAO qui récupère les images à partir de leur nom (ou de leur id) sans t'emmêler les claviers entre les images 1, 2, 3... et si il y a une image n ou pas.

    Là, si le nom correspond à bsolution1, il faut récupérer img1 SINON si le nom correspond à bsolution2, il faut récupérer img2 et ainsi de suite.
    Donc le plus simple, c'est de faire les 5 requêtes l'une après l'autre, et s'arrêter dès que quelque chose est trouvé.

  15. #15
    Nouveau membre du Club
    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
    Points : 27
    Points
    27
    Par défaut Réponse aux commentaires
    La solution que tu me proposes je l'a comprends , mais ca veut dire que je dois faire 5 champs labels dans ma JSP !
    Au niveau de mon DaoImpl, je ne fais pas qu'une seule requête mais plusieurs... ok ... pourquoi pas........., mais de façon simple, pourquoi une requête qui demande d'afficher qu'une seule table (là où j'ai des donc les images), n'affiche que la première colonnes de ma table et pas les autres ?

    C'est un peu ça que j'ai du mal à comprendre !!!

  16. #16
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Le problème n'est pas sur la colonne affichée mais sur la colonne filtrée.
    Ta requête est SELECT * FROM bsolutionwithimg AS b WHERE b.bsolution1 LIKE ?.
    Si tu cherches à afficher l'image2, tu dois faire la recherche sur b.bsolution2 et non pas bsolution1.

    Imaginons le cas d'un album photo. L'album a 5 pages, on ne peut voir qu'une seule page à la fois. Tu cherches à voir la photo de Pierre, mais tu ne regardes que le nom sur la page 1. Si c'est Pierre, tant mieux. Si ce n'est pas Pierre, ben, tant pis tu t'arrêtes là et tu ne regardes pas les autres pages.
    Ce que tu dois faire, c'est regarder page par page le nom qui va avec la photo et récupérer la photo qui se trouve sur la page en question.

  17. #17
    Nouveau membre du Club
    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
    Points : 27
    Points
    27
    Par défaut Réponse aux commentaires
    Non en fait, mes images sont sur la même table. Je veux afficher ma table. Cette table possède donc 5 images dans 5 colonnes différentes.
    bsolution1 est ma premire colonne, et je filtre sur cette colonnes afin d'afficher les images associées à cette référence.

    Je pense que le problème peut venir de cette ligne dans la servlet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte[] imageData = imageEnBdds.getBytes(1, (int) imageEnBdds.length());
    mais aussi du DaoImpl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    blob = rs.getBlob("img1");
    Qu'en penses-tu ?

  18. #18
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Pourquoi s'acharner à stocker tes images dans la base?

  19. #19
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Sinon, tu as essayé la solution que t'a proposé joel au début avec une simple gestion du nullpointer avec un if not null :

    Citation Envoyé par joel.drigo Voir le message
    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);
    Et l'utilisation avec :
    Code java : 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
        try {
     
            Blob imageEnBdds = metier.affImg(imageName, imageIndex); /* La méthode pr l'affichage des images est de type Blob */
     
            response.setContentType("image/png");
            OutputStream o = response.getOutputStream();
            if (imageEnBdds != null && imageEnBdds.length() >= 1) {
                byte[] imageData = imageEnBdds.getBytes(1, (int) imageEnBdds.length());           
                o.write(imageData);
     
            }
            o.flush();
            o.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

  20. #20
    Nouveau membre du Club
    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
    Points : 27
    Points
    27
    Par défaut Réponse aux commentaires
    Je suis obligé d'aller lire mes images en BDD car chaque ligne de ma table est différente, et les images sont vraiment différentes aussi d'une colonnes à une autre.
    Oui, je viens de retester la méthode de Joel du début mais toujours la même erreur. Y a un truc qui m'échappe mais je ne sais pas quoi !!! pfff

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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