如何将base64图像存储为GAE数据存储区中的文件

时间:2013-06-19 17:35:58

标签: python google-app-engine base64

我有一个用base 64编码的图像,我希望将其存储在我的数据存储模型中。

class Surveys(db.Model):
    name = db.StringProperty(required = True)
    text = db.TextProperty(required = True)
    image = db.BlobProperty()
    created = db.DateTimeProperty(auto_now_add = True)

如何将base64字符串转换回我可以放入数据库的文件?以下是我对普通文件的处理方式。

name = 'test'
text = 'test'
image = self.request.get('img')
s = Surveys(name = name, text = text)
s.image = db.Blob(image)
s.put()

3 个答案:

答案 0 :(得分:5)

您是否在寻找解码base64数据的方法?

您可能希望了解Python提供的各种base64 utilities。例如,base64.b64decode

import base64

binary_data = base64.b64decode(base64_encoded_string)

假设JPEG文件已正确编码为base64,这将“反转”操作 - 返回与原始文件内容相同的字节串。所有文件“元信息”在此过程中都会丢失:您只能获取文件的内容。不是它的原始名称,权限等。

答案 1 :(得分:1)

您可以直接将base64字符串存储到数据存储区,然后在运行时在需要发送JPEG字节时对其进行解码。

或者反过来做...我更喜欢在存储到数据存储之前先解码base64,因为它的字节效率更高,你只需要解码一次。

这里你不需要“文件”的概念......你只需将图像存储为字节,当你需要将它作为JPEG发送到浏览器时,你只需要创建正确的http标题(例如Content-输入:image / jpeg)并在http体中回显/写入字节。

答案 2 :(得分:1)

添加其他所有内容(这是一个很好的建议):考虑使用ndb(新数据库)而不是db来表示模型。如果您为单个图像检索执行get_by_id(),ndb将为您处理memecache。这将真正加快您经常访问的图像的延迟。此外,如果它是经常访问的图像,除了类型之外,还要在响应头中添加缓存控制语句。 HTH。 -stevep

self.response.headers['Content-Type'] = 'image/jpeg'
self.response.headers['Cache-Control']  = 'public, max-age=315360000'