使用休眠从数据库中检索Blob,并使用jsp在网页上显示

时间:2018-08-30 03:43:11

标签: java arrays hibernate jsp blob

Answer mentioned here这对我不起作用 我已将字节数组发送到数据库,该数组作为Blob存储在数据库中

File file = new File(filePath);
byte[] imageData = new byte[(int) file.length()];

当我尝试从数据库中的此字节数组中检索blob对象

我得到一个类似“ [B @ 526d24d9””的值。 我将此值发送到jsp页面。(我正在将blob列表发送到jsp页面,即字节数组列表) 现在,我试图使用jsp在网页上呈现此图像。但我无法找出最有效的方法 一种方法是检索blob的列表,对其进行处理并将其存储在文件中,然后使用标记从jsp页面中的该文件路径中进行检索 但我正在寻找一种更有效的方法。 I am trying to something like this

jsp代码

<c:forEach items="${list}" var="list" varStatus="loop">
   <c:set var="l" value="${loop.index}" />

    <tr>
    <td><c:out value= "${l+1}" /></td>
      <td><c:out value="${list.name}" /></td>
      <td><c:out value="${list.size} MB" /></td>
      <td><c:out value="${list.preview}" /></td>
      <td><i class="material-icons">edit</i>
      <i class="material-icons" onclick="Remove()">delete</i></td>
    </tr>
  </c:forEach>

list.preview包含字节数组“ [B @ 526d24d9”

2 个答案:

答案 0 :(得分:1)

请记住,来自数据库的数据是图像文件的实际字节。您需要在JSP中放入一个 标记,并带有对图片的引用。另外,您将需要一个仅将纯图像作为响应输出的控制器-而不是嵌入HTML中。

对于步骤1,您的JSP应该类似于:    

<tr>
  <td><c:out value= "${l+1}" /></td>
  <td><c:out value="${list.name}" /></td>
  <td><c:out value="${list.size} MB" /></td>
  <td><img src="<c:out value="${list.previewUrl}" />"></td>
  <td><i class="material-icons">edit</i>
  <i class="material-icons" onclick="Remove()">delete</i></td>
</tr>

(您需要定义PreviewUrl并将其指向可以写出图像数据的控制器)

在第二步中,您需要创建一个控制器,该控制器会将图像字节数组的内容输出到HttpServletResponse的输出流。

最后一点:对于第一个片段,我有点困惑-您是从文件还是从数据库中检索图像数据? (如果是后者,则字节数组的大小可能计算错误)

答案 1 :(得分:1)

在您的实体类中创建一个String PreviewUrl字段。 然后在吸气剂内部编写此代码。

public String getPreviewUrl() {
        String pu = Base64.encode(getPreview());
        setPreviewUrl(pu);
        return previewUrl;
    }

以及您的jsp代码

<td><img class='imagem_artigo' src='data:image/png;base64,${list.previewUrl}' alt='IMG DESC' width="200" height='200'></td>

这将起作用