将base64字节数组转换为图像

9
我有一个表单bean,其中包含id、desc和imageByteArray属性。执行Struts操作并重定向到JSP页面,在那里我想访问这些bean属性,如id、desc,并将imageByteArray转换为图像显示出来。我尝试了这个帖子,但对我来说没有用。

我使用Base64对字节数组进行编码-其中this.bean.imageByteArray指的是表单bean。

this.bean.setImageByteArray(new org.apache.commons.codec.binary.Base64().encode(imageInByteArr));

我尝试了这个,但没有起作用。
<img src="data:image/jpg;base64,<c:out value='${bean.imageByteArray}'/>" />

字节数组(byte[] imageByteArray)指的是一个base64编码的JPG图像,我得到了以下的img标签作为输出,但显然没有显示任何内容,

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

有没有想法如何将base64字节数组转换并在JSP中显示为图像?

请告诉我“但不起作用”确切指什么。输出是什么样子?“imageByteArray”的类型是什么?我猜你需要调用“encodeString”... - home
需要将真实的(非base64编码的)字节数组显示为图像的人,请前往https://dev59.com/7nE95IYBdhLWcg3wXsuR。 - BalusC
2个回答

12
你得到的只是数组的toString输出。但你需要将字节数组转换为字符串。 你应该在bean中创建一个方法。

public String getByteArrayString()
{
   return new String(this.imageByteArray);
}

并在您的JSP中引用它。

尽管从技术上讲,您应该定义用于一组Base64字节的编码方式,但这并不是必需的,因为所有字符都在标准的7位ASCII范围内。


太好了,它起作用了。我查看了很多与这种问题相关的SO帖子,但是我没有看到任何正确的答案。你节省了我的时间。谢谢。 - SyAu
我刚看到这个答案,但几乎可以肯定这不是在这里要做的正确事情。它基本上是将两个错误的想法叠加在一起。OP已经执行了base64编码 - 因此应该将其保存为对象内的字符串,而不是字节数组。或者,在输出数据之前,他们不应该对数据进行base64编码。基本上,正确的转换是byte[]到base64编码的字符串 - 而不是"`byte[] to base64-encoded-then-ASCII-encoded byte[], then byte[] to string"。 - Jon Skeet
此外,你在结尾处关于编码的评论是不正确的 - 这将使用平台默认编码... 如果那是UTF-16呢?或者EBCDIC?或者其他一些不兼容ASCII的编码? - Jon Skeet
@DoubleMalt "在你的JSP中引用这个",请问我该如何在我的jsp页面中实现这个?<img src="data:image/jpg;base64,<c:out value='${pc.getByteArrayString()}'/>" />但是它对我不起作用。我有一些类似于<img src="data:image/jpg;base64,ÿØÿà�JFIF����....的东西。谢谢。 - Ait Friha Zaid

3

DoubleMalt的答案(在撰写时被接受)很不幸,因为它有些使用了两个错误来弥补一个错误。Apache Commons Codec使得做错事情变得太容易了:(

Base64本质上是从二进制数据到文本的编码-因此,它几乎总是用于将byte[]转换为String。你的问题在于你正在将byte[]转换为另一个byte[]-但之后你想将该数据用作字符串。最好只进行一次正确的转换。

现在,您可以选择何时将其转换为base64(和字符串)。您可以在Java代码中尽早完成,这种情况下我会使用:

// Obviously you'd need to introduce a new method for this, replacing
// setImageByteArray
this.bean.setImageBase64(new Base64().encodeToString(imageInByteArr));

<img src="data:image/jpg;base64,<c:out value='${bean.imageBase64}'/>" />

或者,您可以只在bean中保存二进制数据,并在JSP中执行编码。我很久没有编写JSP了,所以我不会在这里尝试编写代码。

但是,基本上,您需要决定您的bean是否应将原始二进制数据保存为byte[],还是将base64编码数据保存为String。任何其他方式都是误导性的,我认为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接