使用python2.7手动将图片存储到mongo db

时间:2014-11-21 20:51:30

标签: python mongodb arduino

我需要使用多个HTTP帖子传输.png图片(Arduino无法立即发送)。在服务器端,我需要将该图片存储在Mongo DB中的多个条目中。然后,我需要能够重新组装并在网站上显示它。

这是我处理它的方法(离线):

f = open("icon.png", "rb").read()
length = len(f)
chunk1 = base64.b64encode( f[length/2:] )
chunk2 = base64.b64encode( f[:length/2] )

//Store to db
//Retrieve from db into chunk1, chunk2
//Here is the simple idea behind what I want to do(which works fine if I store and retrieve the entire image in one db entry):

html_img = '<img src="data:image/png;base64,{0}{1}">'.format(chunk1.decode(), chunk2.decode())

它不起作用。当我检索这两个块时,它们看起来有点像这样:

chunk1: iVBORw0KGgoAAAANSUhEUg==
chunk2: AAABAAAAAQAIBgAAAFxyqA==

以相同方式存储和检索的整个块看起来像这样:

iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqg=

我知道我对这个主题缺乏理解,我希望有人可以指出正确的方法解决我的问题。

1 个答案:

答案 0 :(得分:0)

您遇到的问题与填充处理有关。

Base-64单位是6位,因此每3个字节创建4个b64字符。如果原始字节数不是3的倍数,则将0值字节添加到填充为3的倍数。填充字节数由=个字符表示。

在你的例子中,每一半都有一个额外的字节(需要2个字节的填充),而整个字符串只需要1个。

第二个问题是<img>标记。如果你想使用base64,那么你不应该先解码它;保留基础64.问题是你可以按照分割它们的方式连接字符串。

解决方案是确保第一个块都是由3个字节的倍数组成的。这样,那些就没有填充,你可以正确地将b64字符串连接在一起。只有最后一个块会有填充,并且字符将与您一次编码整个事物的字符相同。