将图像作为JSON传递或在http响应中组合两种内容类型

时间:2015-10-03 19:09:18

标签: python json matplotlib response

我已经构建了一个使用JSON响应的Python Flask App API。我希望现在的响应包括JSON和图像。

如何创建一个传递JSON数据和图像的HTTP响应?

对于JSON,我使用return jsonify({some dict})

对于图像,我已阅读以使图像成为StringIO对象,然后在其上使用.get_value()并将StringIO.get_value()作为参数传递给response()并返回那。图像由matplotlib生成(参见https://gist.github.com/wilsaj/862153

虽然http响应无法发送多种内容类型,但传递图像的方式似乎意味着它只是文本。真的吗?如果是这样,图像是否也可以简单地包装在JSON中,作为与传递的其他JSON数据分开的一个键?

这些帖子似乎表明是,图像可以通过带有字节数组的JSON传输。

How can I add an image file into json object?

Binary Data in JSON String. Something better than Base64

我已经读过,通常最好将URL传递给JSON中的图像,然后在客户端下载图像。但是我的图像是动态生成的,不需要持久存在,而且我不必将图像保存为文件并尽可能地提供它们,那么Byte数组似乎是正确的方向吗?

1 个答案:

答案 0 :(得分:2)

您可以将图像数据编码为base64。

根据您链接的代码,这可能如下所示:

import base64
import StringIO

# ...

png_output = StringIO.StringIO()
canvas.print_png(png_output)

# ...

some_dict["imagedata"] = base64.b64encode(png_output.getvalue())

要在网络浏览器(Javascript应用程序)中使用,您可以以

格式直接生成Data URIs
data:image/png;base64,<BASE64 ENCODED IMAGE DATA>

可以直接送入图片代码的src属性。