【问题标题】:JSP display image from byte array in Java objectJSP从Java对象中的字节数组显示图像
【发布时间】:2015-08-06 06:12:08
【问题描述】:

我有一个复杂的 Java 对象列表,其中包含一个字节数组作为从 DB 中检索的图像格式。 POJO中有文件名、文件类型和字节数组格式的文件数据等。字节数组的长度约为 20k。我可以通过 javascript 在 JSP 中将其显示为:

for(var i in data){
   var imgelement = document.createElement("IMG");
   imgelement.id=data[i].fileId;
   imgelement.src = "data:"+data[i].fileType+";base64,"+data[i].thumbnail;
}

这将正确显示 IMG。

但是当我尝试通过使用 jstl foreach 函数迭代我的 POJO 列表将它放入我的普通 JSP 中时,我从来没有得到我的图像显示。

<c:forEach items="${searchResult}" var="current" varStatus="i">
    <c:choose>
        <c:when test="${(i.count) % 2 == 0}">
            <c:set var="rowclass" value="rowtwo" />
        </c:when>
        <c:otherwise>
            <c:set var="rowclass" value="rowone" />
        </c:otherwise>
    </c:choose>
    <tr class="${rowclass}">

        <td nowrap="nowrap" class="tabletd"> <img src="data:${current.miniFile.fileTyle};base64,<c:out value='${current.miniFile.thumbnail}'/>"/> &nbsp;</td>
        <td nowrap="nowrap" class="tabletd"> ${current.site.siteName} &nbsp;</td>
        <td nowrap="nowrap" class="tabletd"> ${current.distance} &nbsp;</td>
        <td nowrap="nowrap" class="tabletd"> ${current.site.siteAccessby} &nbsp;</td>
        <td nowrap="nowrap" class="tabletd"> ${current.site.siteAddressFormated} &nbsp;</td>
    </tr>
</c:forEach>

在我的html页面中有输出显示,src为字节数组:

<img src="data:image/jpeg;base64,[B@2e29c573">

有什么想法吗?请指教!

编辑

我正在尝试通过 jsp:useBean 使用 Java 8 Java.util.Base64 的函数来进行字节数组转换,但它仍然不适合我。

其他问题,我如何使用 jsp:useBean 来做到这一点?因为变量是jstl变量。即我需要使用 jsp:usedBean 函数来处理 jstl 局部变量。

代码如下:

<tr class="${rowclass}">
    <jsp:useBean id="obj" class="java.util.Base64"/> 
    <jsp:setProperty name="imageStr" property="String" value="${current.miniFile.thumbnail}"/>
    <td nowrap="nowrap" class="tabletd"> <img src="data:${current.miniFile.fileTyle};base64,<c:out value='${current.miniFile.thumbnail}'/>"/> &nbsp;</td>

我没有使用jsp:useBean处理jstl变量的经验,有经验的请分享给我!赞赏!

再次编辑

有一个使用jsp:useBean做Date类型收费的例子

【问题讨论】:

标签: java image jsp bytearray


【解决方案1】:

[B@2e29c573 表示您只是打印出一个字节数组。您必须将原始字节数组转换为 base64 编码字符串。您可以使用commons-codec 中的Base64.encodeBase64String 之类的方法来完成

【讨论】:

  • 如果您能提及执行您所说的代码的确切行会有所帮助。
【解决方案2】:

不知何故,我从来没有让它在我的 JSP 中工作。似乎在 jstl forEach 迭代器中有一些难以处理的变量。当我试图通过调用java方法来处理它时,JSP解析器总是抛出解析异常。

最终,我必须更改我的服务器端代码以更新我的 POJO 以支持 Base64 编码字符串而不是字节数组。

我使用 Java 8 Base64 来实现。它工作正常。

希望这会帮助我遇到的其他人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多