我一直在努力解决谷歌应用引擎存储数据的基本原理
我已经定义了一个定义客户端配置文件的类:
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...
所以这么好,数据是一个image / png,编码是Base64,但我应该关心它是否以Blob结尾?
现在,如果我尝试将数据放入照片Blob
例如:
clientprofile.photo = imagesrc
我收到了错误值错误,在这种情况下:
BadValueError:期望的str,得到了 u'data:图像/ PNG; BASE64,iVBORw0KGgoAAAANSUhEUgAAAMgAA
我尝试了使用不同解决方案的所有组合,并找回所有类型的BadValue或输入错误。
我的问题是: 1)为什么Blob关心,如果它是二进制存储,我应该能够在不需要解释它和/或转换它的情况下转储它,所以Blob真的是Binary / Raw存储,为什么它关心关于如何存储内容?
2)2年前,当我仍然使用db而不是ndb时,我已经开始遇到问题了,通过在数据字符串的开头删除MIME信息,解码字符串Base64,我发现了一个我不理解的解决方案并使用db.Blob(...)将我的字符串转换为Blob。问题是db.Blob()似乎不存在于ndb中,所以我不能再这样做了。
我确信我遗漏了谷歌应用引擎和浏览器之间交换信息方式的基本信息,并提前感谢您的心灵清除答案
答案 0 :(得分:4)
BlobProperty
意味着是二进制数据。 Python中的str
类型完全等同于字节字符串,因为允许的唯一字符是
[chr(byte_value) for byte_value in range(2**8)]
因此,在存储来自self.request.get('photosrcbase64')
unicode
类型的值之前,您需要转换为str
类型。
你可以直接这样做
imagesrc = str(self.request.get('photosrcbase64'))
或首先尝试解码为ascii。