Как отобразить изображение из базы данных mysql с помощью spring mvc
Я храню изображение типа BLOB в базе данных MySQL, используя Spring MVC для элемента класса Item (itemId, itemName, itemPrice, itemContent, itemImage). Я успешно сохранил изображение в базе данных, но когда я пытаюсь отобразить его в своем jsp, он показывает что-то двоичное, как [B@7fb0c025.
как я могу отобразить правильное изображение в JSP (изображение хранится в таблице базы данных MySQL)
мой класс модели:
@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.ССП", чтобы добавить атрибуты элемента вместе с изображение в базе данных.
<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>
страница JSP для отображения атрибутов элемента вместе с изображением. Кодтипа:
<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>
как я могу правильно отобразить изображение, которое хранится в базе данных? Думаю,я делаю это неправильно, отображая изображение в JSP. Но как я могу отобразить изображения в JSP?
4 ответов
Я, наконец, могу отобразить изображение на моем jsp. что я сделал.
Я отдельно создал такой контроллер.
@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();
и в JSP, я сделал это
<img src="/Project1/myImage/imageDisplay?id=${item.itemId}"/>
и изображение было успешно отправлено.
Я написал ниже код в моем контроллере, и он отлично работает для меня.
в моем проекте пользователь содержит объект профиля, который имеет photo @Lob. Измените этот код в соответствии с вашими атрибутами.
byte[] encodeBase64 = Base64.encode(user.getProfile().getPhoto());
String base64Encoded = new String(encodeBase64, "UTF-8");
mav.addObject("userImage", base64Encoded );
в файле JSP я написал код
<img src="data:image/jpeg;base64,${userImage}" />
для этого вам требуется jar common-codec.
кроме того, вы можете использовать пользовательский тег для показа изображения.
еще одна вещь вы можете сделать для отображения изображения в JSP из базы данных. предположим, вам нужно отобразить изображения всех пользователей в jsp. для этого вы можете создать свой собственный тег custome jstl, который содержит код для преобразования байтового изображения в изображение base64.
здесь, в моем проекте, изображение находится в классе профиля
Я.е пользователей.веб сервиса 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()); }
}
}
создать файл tld в WebContent. у меня есть файл create в моей папке taglib
<?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>
теперь вы можете писать код в JSP для отображения изображения.
<img src="<ui:image usrImage='${user.profile.photo}' />
каждый раз, когда нет необходимости преобразовывать изображение в контроллере, просто передайте байтовое изображение в jsp, и наш тег custome преобразует байтовое изображение и отобразит его на странице просмотра.
Примечание: включите файл тегов custome в файл jsp
<%@ taglib uri="/taglib/userimage.tld" prefix="ui"%>
однако я использовал собственный запрос, чтобы получить ArrayList поэтому я не мог использовать метод setter и getter в моем контроллере для получения байтов для кодирования в Base64, вместо этого я создал поле @Transient в моем классе Dao для кодирования в base64, и это сработало.
в моем 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;
}
и в представлении jsp вы можете сделать это
<img src="data:image/jpeg;base64,${tempCust.imgUtility}"/>