3

我一直在努力了解谷歌应用引擎如何存储数据的一些非常基本的理解

我已经定义了一个定义客户端配置文件的类:

class ClientProfile(ndb.Model):
    nickname = ndb.StringProperty(required=True)
    photo = ndb.BlobProperty()
    uuid = ndb.StringProperty(required = True)

我检索图像数据仅通过使用 jquery.ajax(...) 的 POST 上传 image.src

数据已正确发送到 Google 应用引擎,我可以将它们分配给一个变量

imagesrc = self.request.get('photosrcbase64')

数据内容看起来像:

"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...

这么好,数据是图像/png,编码是 Base64,但我应该关心它是否以 Blob 结尾?

现在,如果我尝试将数据放入照片 Blob

例如:

clientprofile.photo = imagesrc在这种情况下,我收到错误值错误:

BadValueError: Expected str, got u'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAA

我使用不同的解决方案尝试了各种组合,并得到了各种 BadValue 或类型错误。

我的问题是:1)为什么 Blob 关心,如果它是二进制存储,我应该能够在其中转储任何东西而无需解释和/或转换它,所以 Blob 真的是二进制/原始存储和为什么它关心事物如何存储在其中?

2)我在2年前仍然使用db而不是ndb时开始遇到问题,我通过剥离数据字符串开头的MIME信息,解码字符串Base64并使用db找到了一个我不理解的解决方案.Blob(...) 将我的字符串转换为 Blob。问题是 db.Blob() 似乎在 ndb 中不存在,所以我不能再这样做了。

我确信我在谷歌应用引擎和浏览器之间交换信息的方式中遗漏了一些基本的东西,并提前感谢您提供清晰的答案

4

1 回答 1

4

ABlobProperty表示二进制数据。Python 中的str类型完全等同于字节字符串,因为唯一允许的字符是

[chr(byte_value) for byte_value in range(2**8)]

因此,在存储来自self.request.get('photosrcbase64')type的值之前unicode,您需要强制转换为 type str

您可以直接这样做

imagesrc = str(self.request.get('photosrcbase64'))

或首先尝试解码为ascii。

于 2013-08-20T16:05:16.957 回答