1

我的 xhtml 中有一个画布元素。String我通过调用将其转换为名为 dataUrl的 base-64 编码toDataUrl()。这会产生以下输出,为清楚起见被截断:

"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAzQAAAImCAYAAACFG89TAAAgAElEQVR4Xu29C7x/5Zj3 [lots of characters...]"

我想将此图像发送到我的 MySQL 数据库。我的实体中有一个 Blob (@Lob) 字段,为了将此字符串转换为字节数组,请使用dataUrl.getData()此字节数组并更新我的实体。

在我的 MySQL 数据库中,BLOB 已成功创建。但是,当我右键单击它并单击在编辑器中打开文件时,我看到字节选项卡很好,但是当我单击图像选项卡时收到一般错误,表明字节以某种方式损坏。

这意味着当我想读取这个文件时,使用BufferedImage imag = ImageIO.read(is);where isis aByteArrayInputStream和字节数组作为参数,imag返回 null,更具体地说是类中的read方法BufferedImage

编辑:看截图,第一个是dataUrl.getBytes()调用,第二个是 MySQL 输出。

在此处输入图像描述

在此处输入图像描述

4

2 回答 2

2

而不是String.getBytes(),我使用:

BASE64Decoder decoder = new BASE64Decoder();
byte[] b = decoder.decodeBuffer(dataURL.split("^data:image/(png|jpg);base64,")[1]);

它工作得很好。

于 2013-08-24T19:19:43.447 回答
1

好吧,这听起来dataUrl.getData()不适合你。您存储的字节基本上是“data:image/png;base64,iVBORw0KGg...”的 ASCII,而不是存储在 base64 部分本身的二进制数据。

您可能在某处对其进行了双重编码——如果没有看到你的代码很难判断——但这就是我们目前所能看到的。

我建议您先查看字节数组,然后再将其存储到数据库中。前几个字节应该是 0x89、0x50、0x4e、0x47、0x0d、0x0a、0x1a。一旦你让部分工作,如果它仍然不起作用,你可以继续前进。

基本上,在流程的每个阶段检查数据,这样您就可以检测到失败的解码/双重编码/无论它是什么。

于 2013-08-24T18:16:01.577 回答