如何将应用引擎的Image对象存储到数据库中?
我在写代码的时候遇到了一些问题:
def setVenueImage(img):
img = images.Image(img.read())
x, y = photo_utils.getIdealResolution(img.width, img.height)
img.resize(x, y)
img.execute_transforms()
venue_obj = getVenueSingletonObject()
if venue_obj is None:
venue_obj = Venue(images = [img])
else:
venue_obj.images.append(img)
db.put(venue_obj)
我在用Django和App Engine,所以img.read()这个方法是没问题的。
实际上,直到我尝试把img存入数据库之前,所有的代码都运行得很好。我的模型需要一个Blob类型的数据,所以当我把图片直接放进img的时候,就出错了,错误信息是:
在 /admin/venue/ 出现了BadValueError: 图片列表中的所有项必须都是Blob实例
好吧,看来图片不能直接作为Blob,那我该怎么把它转换成Blob呢?Blob需要一个字节字符串,但我该如何把我的图片变成字节字符串呢?
我在文档中没有找到关于如何使用图片对象的说明,所以我不太确定这一切应该怎么进行。不过我确实想用图片对象来调整图片大小(我知道可以用PIL来做,但我想知道如何用谷歌的Image类来实现)。
谢谢任何指点 :)
3 个回答
0
我觉得这个链接应该能帮到你。祝你好运。
2
我对这个解决方案不太满意,因为它并没有把一个图片对象转换成一个二进制大对象(blob),不过暂时可以用一下:
def setVenueImage(img):
original = img.read()
img = images.Image(original)
x, y = photo_utils.getIdealResolution(img.width, img.height)
img = images.resize(original, x, y)
venue_obj = getVenueSingletonObject()
if venue_obj is None:
venue_obj = Venue(images = [db.Blob(img)])
else:
venue_obj.images.append(db.Blob(img))
db.put(venue_obj)
2
这可能会有效:
def setVenueImage(img):
img = images.Image(img.read())
x, y = photo_utils.getIdealResolution(img.width, img.height)
img.resize(x, y)
img_bytes = img.execute_transforms() # Converts to PNG
venue_obj = getVenueSingletonObject()
if venue_obj is None:
venue_obj = Venue(images = [img_bytes])
else:
venue_obj.images.append(img_bytes)
db.put(venue_obj)
我假设 Venue.images 是一个包含二进制数据的列表,对吧?这样做可能不太对。你应该定义一个 VenueImage 模型,里面有一个简单的二进制数据属性,然后把它的键存储到 Venue 里。如果你直接把图片放在这里,你会遇到数据存储的 1MB 行限制。