2

我有一个用 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()
4

3 回答 3

5

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

您可能希望查看Python 提供的各种base64 实用程序。例如base64.b64decode

import base64

binary_data = base64.b64decode(base64_encoded_string)

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

于 2013-06-19T17:55:10.717 回答
1

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

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

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

于 2013-06-20T04:15:54.950 回答
1

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

self.response.headers['Content-Type'] = 'image/jpeg'
self.response.headers['Cache-Control']  = 'public, max-age=315360000'
于 2013-06-20T15:59:05.787 回答