Java 将转换的画布数据URL字节保存到数据库时Blob损坏
我的xhtml中有一个canvas元素。我使用Java 将转换的画布数据URL字节保存到数据库时Blob损坏,java,canvas,inputstream,java-2d,bytearrayinputstream,Java,Canvas,Inputstream,Java 2d,Bytearrayinputstream,我的xhtml中有一个canvas元素。我使用toDataUrl()调用将其转换为名为dataUrl的base-64编码的字符串。这将生成以下输出,为清晰起见,将其截断: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAzQAAAImCAYAAACFG89TAAAgAElEQVR4Xu29C7x/5Zj3 [lots of characters...]" 我想将此图像发送到我的MySQL数据库。我的实体中有一个Blob(@Lob)字段,要将此字符
toDataUrl()
调用将其转换为名为dataUrl的base-64编码的字符串。这将生成以下输出,为清晰起见,将其截断:
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAzQAAAImCAYAAACFG89TAAAgAElEQVR4Xu29C7x/5Zj3 [lots of characters...]"
我想将此图像发送到我的MySQL数据库。我的实体中有一个Blob(@Lob)字段,要将此字符串转换为字节数组,请使用dataUrl.getData()
并使用此字节数组更新实体
在我的MySQL数据库中,BLOB被成功创建。但是,当我右键单击它并在编辑器中单击“打开文件”时,我看到“字节”选项卡很好,但在单击“图像”选项卡时收到一个一般性错误,表明字节不知何故已损坏
这意味着当我想要读取这个文件时,使用BufferedImage imag=ImageIO.read(is)
其中is
是一个ByteArrayInputStream
,以字节数组为参数,imag
返回null,更具体地说是BufferedImage
类中的read
方法
编辑:参见屏幕截图,第一个是dataUrl.getBytes()
调用,第二个是MySQL输出
好的,听起来好像dataUrl.getData()
不适合您。存储的字节基本上是“data:image/png;base64,iVBORw0KGg…”的ASCII码,而不是存储在base64部分本身中的二进制数据
您可能在某个地方对其进行了双重编码—如果不查看代码,很难判断—但这就是我们目前所看到的
我建议您在将字节数组存储到数据库之前先查看它。前几个字节应该是0x89、0x50、0x4e、0x47、0x0d、0x0a、0x1a。一旦你让那个部分工作,如果它仍然不工作,你可以继续前进
基本上,在流程的每个阶段都要检查数据,这样您就可以检测到失败的解码/双重编码/无论它是什么。我使用了以下方法,而不是String.getBytes()
:
BASE64Decoder decoder = new BASE64Decoder();
byte[] b = decoder.decodeBuffer(dataURL.split("^data:image/(png|jpg);base64,")[1]);
它工作得很好。那么您在字节选项卡中看到了哪些值?您从dataUrl.getData()
中获得了哪些字节?请用每种情况下的前16个字节编辑您的问题。用此信息更新了我的问题。第一个屏幕截图实际上没有显示任何数据,是吗?请展开第一行。展开行和单击[…]都会显示空白输出。考虑到您显然正在管理存储数据,这将非常奇怪。查看我的答案,了解您存储的内容。。。