Comment afficher l'image à partir de la base de données mysql en utilisant MVC printemps
je stocke l'image de type BLOB dans la base de données MySQL en utilisant MVC de printemps pour L'article de classe (itemId, itemName, itemPrice, itemContent, itemImage). J'ai enregistré l'image avec succès dans la base de données mais quand j'essaie de l'afficher dans mon jsp, il montre quelque chose de binaire comme [B@7fb0c025.
Comment puis-je afficher une image correcte dans JSP (l'image est stockée dans la table de base de données MySQL)
ma classe modèle:
@Entity
@Table(name="item")
public class Item {
@Id
@Column(name="ItemId")
@GeneratedValue
private Integer itemId;
@Column(name="ItemName")
private String itemName;
@Column(name="ItemContent")
private String itemContent;
/*
@Column(name="ItemImage")
private ByteArray ItemImage;
*/
@Column(name="ItemPrice")
private int itemPrice;
@Column(name="ItemImage")
private byte[] itemImage;
" addItem.jsp" pour ajouter les attributs d'élément avec l'image dans la base de données.
<form:form modelAttribute="itemAttribute" enctype="multipart/form-data" method="POST" action="${Url}">
<table>
<tr>
<td><form:label path="itemId"></form:label></td>
<td><form:input path="itemId" type="hidden"/></td>
</tr>
<tr>
<td><form:label path="itemName">ItemName:</form:label></td>
<td><form:input path="itemName"/></td>
</tr>
<tr>
<td><form:label path="itemPrice">ItemPrice:</form:label></td>
<td><form:input path="itemPrice"/></td>
</tr>
<tr>
<td><form:label path="itemContent">ItemContent:</form:label>
<td><form:input path="itemContent"/>
</tr>
<tr>
<form:label for="itemImage" path="itemImage">itemImage:</form:label>
<form:input path="itemImage" type="file" />
</tr>
</table>
<input type="submit" value="Save" />
</form:form>
la page JSP pour afficher les attributs d'item avec l'image. CategoryId:
<tr>
<td><form:label path="categoryName">CategoryName:</form:label></td>
<td><form:input path="categoryName"/></td>
</tr>
</table>
<input type="submit" value="Save" />
<table width: 100%; text-align:center">
<tr>
<th>ItemId</th>
<th>ItemName</th>
<th>ItemPrice</th>
<th>ItemFeatures</th>
<th>Edit</th>
<th>Delete</th>
<th>ItemImage</th>
</tr>
<tbody>
<c:forEach items="${categoryAttribute.item}" var="item">
<tr>
<c:url var="editCUrl" value="/item/edit?bid=${categoryAttribute.categoryId}&cid=${item.itemId}" />
<c:url var="deleteCUrl" value="/item/delete?id=${item.itemId}" />
<td><c:out value="${item.itemId}" /></td>
<td><c:out value="${item.itemName}"/></td>
<td><c:out value="${item.itemPrice}"/></td>
<td><c:out value="${item.itemContent}"/></td>
<td><a href="${editCUrl}">EditItem</a></td>
<td><a href="${deleteCUrl}">DeleteItem</a></td>
<td><c:out value="${item.itemImage}"/></td>
</tr>
</c:forEach>
Comment afficher correctement l'image stockée dans la base de données? Je suppose que je le fais mal en affichant une image comme celle-ci dans JSP. Mais comment puis-je afficher l'image ici en JSP?
4 réponses
je suis enfin capable d'afficher l'image sur mon jsp. ce que j'ai fait.
j'ai créé séparément un contrôleur comme celui-ci.
@Controller
@RequestMapping("/myImage")
public class ImageController {
@Resource(name="categoryService")
private CategoryService categoryService;
@Resource(name="itemService")
private ItemService itemService;
@RequestMapping(value = "/imageDisplay", method = RequestMethod.GET)
public void showImage(@RequestParam("id") Integer itemId, HttpServletResponse response,HttpServletRequest request)
throws ServletException, IOException{
Item item = itemService.get(itemId);
response.setContentType("image/jpeg, image/jpg, image/png, image/gif");
response.getOutputStream().write(item.getItemImage());
response.getOutputStream().close();
<img src="/Project1/myImage/imageDisplay?id=${item.itemId}"/>
et l'image a été affichée avec succès.
j'ai écrit le code ci-dessous dans mon contrôleur et ça marche très bien pour moi.
dans mon projet, L'utilisateur contient L'objet de profil qui a la photo @Lob. Modifiez ce code selon vos attributs.
byte[] encodeBase64 = Base64.encode(user.getProfile().getPhoto());
String base64Encoded = new String(encodeBase64, "UTF-8");
mav.addObject("userImage", base64Encoded );
Dans le fichier JSP, j'ai écrit le code
<img src="data:image/jpeg;base64,${userImage}" />
pour cela, vous avez besoin de common-codec jar.
une chose de plus que vous pouvez faire pour afficher l'image dans jsp à partir de la base de données. supposons que vous ayez besoin d'Afficher des images de tous les utilisateurs dans jsp. pour cela, vous pouvez créer votre propre étiquette custome jstl qui contient le code pour convertir l'image byte en image base64.
ici dans mon projet l'image est en classe de profil
I. E utilisateur.getProfile ().getPhoto ()
package com.spring.tags;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import javax.servlet.jsp.tagext.TagSupport;
import org.apache.commons.codec.base64.Base64;
public class UserImage extends SimpleTagSupport {
private byte[] usrImage;
public void setUsrImage(byte[] usrImage) {
this.usrImage = usrImage;
}
@Override
public void doTag() throws JspException, IOException {
System.out.println("tag lib");
try {
JspWriter out = getJspContext().getOut();
if (usrImage != null && usrImage.length > 0) {
byte[] encodeBase64 = Base64.encode(usrImage);
String base64Encoded = new String(encodeBase64, "UTF-8");
out.print("data:image/jpeg;base64,"+base64Encoded);
}
} catch (Exception e) {
throw new JspException("Error: " + e.getMessage()); }
}
}
créer un fichier tld dans WebContent. j'ai créer un fichier dans mon taglib dossier
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" 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 web-jsptaglibrary_2_0.xsd">
<tlib-version>1.0</tlib-version>
<short-name>ui</short-name>
<uri>/taglib/userimage</uri>
<tag>
<name>image</name>
<tag-class>com.spring.tags.UserImage</tag-class>
<body-content>empty</body-content>
<info>This Tag Displayes current user profile image</info>
<attribute>
<name>usrImage</name>
<required>true</required>
<description>Provide a display format</description>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
Maintenant vous peut écrire du code dans jsp pour afficher l'image.
<img src="<ui:image usrImage='${user.profile.photo}' />
chaque fois qu'il n'est pas nécessaire de convertir l'image dans le contrôleur, il suffit de passer byte image à jsp et notre étiquette custome convertira byte image et la diffusera dans la page de vue.
Note: inclure custome fichier de balises dans le fichier jsp
<%@ taglib uri="/taglib/userimage.tld" prefix="ui"%>
cependant, j'utilisais la requête native pour obtenir le tableau<> de sorte que je ne pouvais pas utiliser la méthode setter et getter dans mon contrôleur pour obtenir les octets à encoder pour Base64, au lieu de cela j'ai créé un champ @Transient dans ma classe Dao pour faire Encoder pour base64 et cela a fonctionné.
Dans mon dao
@Transient
private String imgUtility;
//getter method for encoding
public String getImgUtility() throws UnsupportedEncodingException {
byte[] encodeBase64 = Base64.encodeBase64(getImage());
String base64Encoded = new String(encodeBase64, "UTF-8");
return base64Encoded;
}
et dans la page jsp d'affichage vous pouvez le faire
<img src="data:image/jpeg;base64,${tempCust.imgUtility}"/>