【问题标题】:Blob corrupt when saving converted Canvas DataURL bytes to database将转换后的 Canvas DataURL 字节保存到数据库时 Blob 损坏
【发布时间】:2013-08-24 17:42:33
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 那么您在字节选项卡中看到了哪些值?你从dataUrl.getData() 得到了什么字节?请在每种情况下使用(比如说)前 16 个字节来编辑您的问题。
  • 用这个信息更新了我的问题。
  • 第一个屏幕截图实际上并没有显示任何数据,是吗?请展开第一行。
  • 展开行和单击 [...] 均显示空白输出。
  • 这很奇怪,因为您显然正在设法存储数据。请参阅我的答案以了解您正在存储的内容...

标签: java canvas inputstream java-2d bytearrayinputstream


【解决方案1】:

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

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

而且效果很好。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-14
      相关资源
      最近更新 更多