Java 将转换的画布数据URL字节保存到数据库时Blob损坏

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)字段,要将此字符

我的xhtml中有一个canvas元素。我使用
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个字节编辑您的问题。用此信息更新了我的问题。第一个屏幕截图实际上没有显示任何数据,是吗?请展开第一行。展开行和单击[…]都会显示空白输出。考虑到您显然正在管理存储数据,这将非常奇怪。查看我的答案,了解您存储的内容。。。