【问题标题】:How to display image from mysql database using spring mvc如何使用spring mvc显示mysql数据库中的图像
【发布时间】:2014-12-11 14:51:17
【问题描述】:

我使用 Spring MVC 将 BLOB 类型图像存储在 MySQL 数据库中,用于项目类 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.jsp" 将项目属性与数据库中的图像一起添加。

<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 中显示图像呢?

【问题讨论】:

  • 我正在使用 来显示图像。但是我应该怎么做才能在jsp中正确显示图像。

标签: image hibernate jsp spring-mvc controller


【解决方案1】:

我终于可以在我的 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}"/>

并且图片显示成功了。

【讨论】:

  • 感谢您的好回答,我是 spring mvc 的新手,有没有一种方法可以在不创建新控制器的情况下使用此方法?提前谢谢。
  • @bablu 你在哪里定义了 getItemImage()?
  • 您是如何将图像保存在数据库中的?比如什么类型的?
  • 通过模型类,看起来他将itemImage定义为byte[]
【解决方案2】:

我在控制器中编写了以下代码,它对我来说工作正常。

在我的项目中,用户包含具有照片@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。

另外,您可以使用自定义标签来显示图像。

【讨论】:

    【解决方案3】:

    您可以做的另一件事是在 jsp 中从数据库中显示图像。 假设您需要在 jsp 中显示所有用户的图像。 为此,您可以创建自己的自定义 jstl 标签,其中包含将字节图像转换为 base64 图像的代码。

    在我的项目中,图像位于 Profile 类中

    即 user.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());     }
        }   
    }
    

    在 WebContent 中创建 tld 文件。我在我的 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标签将转换字节图像并将其显示在视图页面中。

    注意:在jsp文件中包含custome标签文件

    <%@ taglib uri="/taglib/userimage.tld" prefix="ui"%>
    

    【讨论】:

      【解决方案4】:

      但是,我使用本机查询来获取 ArrayList 所以我无法在控制器中使用 setter 和 getter 方法来获取要编码为 Base64 的字节,而是在我的 Dao 类中创建了一个 @Transient 字段来做编码为base64,它工作。

      在我的道

          @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视图中你可以这样做

      &lt;img src="data:image/jpeg;base64,${tempCust.imgUtility}"/&gt;

      【讨论】:

        猜你喜欢
        • 2018-12-06
        • 2013-04-08
        • 1970-01-01
        • 2020-05-08
        • 1970-01-01
        • 2018-01-02
        • 2015-08-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多