将转换后的Canvas DataURL字节保存到数据库时,Blob损坏

时间:2013-08-24 17:42:33

标签: java canvas inputstream java-2d bytearrayinputstream

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

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

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

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

这意味着当我想要读取此文件时,使用BufferedImage imag = ImageIO.read(is);其中isByteArrayInputStream,其中bytes数组作为参数,imag返回null,更多特别是read类中的BufferedImage方法。

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

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:2)

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

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

它运作良好。

答案 1 :(得分:1)

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

你可能会在某个地方对其进行双重编码 - 如果没有看到你的代码就很难说 - 但这就是我们目前所能看到的。

我建议您在将存储在数据库中之前查看字节数组。前几个字节应为0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a。一旦你那个部分正常工作,如果它仍然不起作用你可以继续前进。

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