【问题标题】:How to represent an image from database in JSON如何用 JSON 表示来自数据库的图像
【发布时间】:2013-01-31 13:57:03
【问题描述】:

我需要基于数据库中的 blob 创建 JSON。为了获取 blob 图像,我使用下面的代码以及在 json 数组中显示之后:

Statement s = connection.createStatement();
ResultSet r = s.executeQuery("select image from images");
while (r.next()) {
    JSONObject obj = new JSONObject();
    obj.put("img", r.getBlob("image"));
}

我想根据图像 blob 为每个图像返回一个 JSON 对象。我怎样才能实现它?

【问题讨论】:

  • 终极目标是什么?在 HTML 页面中显示为<img>?难道你不能只返回一个带有一些图像标识符的 URL 作为请求参数,并在实际请求 URL 时返回图像作为响应吗?
  • BalusC,我需要为每个 r.getBlob("image") 生成 URL,但我不知道该怎么做。这将通过 json 被移动应用程序使用。
  • 啊,您想通过 JSON 将图像传输到移动设备吗?那么编码为Base64呢?
  • 我明白了。好吧,我的数据库中有 blob 类型的图像。我想在我的 API Json 中分发图像,但我不知道该怎么做。
  • 没错。我想通过 json 将图像传输到移动设备。

标签: java json url jdbc blob


【解决方案1】:

JSON 中的二进制数据通常最好以Base64 编码的形式表示。您可以使用标准 Java SE 提供的 DatatypeConverter#printBase64Binary() 方法对字节数组进行 Base64 编码。

byte[] imageBytes = resultSet.getBytes("image");
String imageBase64 = DatatypeConverter.printBase64Binary(imageBytes);
obj.put("img", imageBase64);

对方只是对它进行 Base64 解码。例如。在 Android 中,您可以为此使用内置的 android.util.Base64 API。

byte[] imageBytes = Base64.decode(imageBase64, Base64.DEFAULT);

【讨论】:

  • 优秀。谢谢你,BalusC。 ;-)
  • 处理小数据的代码非常好,但处理大数据时,总是会出现内存不足的情况。有什么想法可以优化代码以避免内存不足吗?一般来说,2000 个项目转换为图像。
  • 确实,byte[] 的每个字节分配一个字节的 JVM 内存。因此,如果每 100KB 有 2000 张图像,已经有 200MB 被吃掉了,那么我不是在谈论 Base64 编码开销。使用来自公共编解码器的Base64OutputStream,而不是使用来自ResultSet#getBinaryStream()InputStream 提供(并且不要使用ByteArrayOutputStream 作为输出源,因为它在封面下也使用byte[]!)。跨度>
  • 我不知道如何解释。只是想确认您在最后一句中看到了“不要”。
  • OPSSSS!从今起。确实,我会搜索有关 Base64OutputStream 的信息。 ;-P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 2018-04-02
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
相关资源
最近更新 更多