2013-08-24 33 views
1

我的xhtml中有一个画布元素。我把它转换成一个base-64编码的String,调用了一个toDataUrl()调用的dataUrl。这将产生以下输出,截断清晰:将转换的Canvas DataURL字节保存到数据库时Blob损坏

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

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

在我的MySQL数据库中,成功创建了BLOB。但是,当我右键单击它并单击在编辑器中打开文件时,我看到字节选项卡罚款,但收到一个通用的错误,当我点击图像选项卡,建议字节已损坏。

这意味着,当欲读取该文件,使用BufferedImage imag = ImageIO.read(is);其中isByteArrayInputStream与字节数组作为参数,返回imag空,更具体地BufferedImage类内的方法read

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

enter image description here

enter image description here

+0

那么你在字节选项卡中看到了什么值?你从dataUrl.getData()中得到了什么字节?请在每种情况下(比如说)前16个字节编辑您的问题。 –

+0

用此信息更新了我的问题。 – tacua

+0

第一个屏幕截图实际上并没有显示任何数据,是吗?请展开第一行。 –

回答

2

相反的String.getBytes(),我用:

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

它工作得很好。

1

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

您可能会在某处进行双重编码 - 在看不到您的代码时很难分辨 - 但这就是我们目前所看到的。

我建议你看看之前的字节数组,你将它存储在数据库中。前几个字节应该是0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a。一旦你有部分工作,如果它仍然不工作,你可以前进。

基本上,检查数据阶段的过程,所以你可以检测到失败的解码/双编码/无论它是。

相关问题