如何将应用引擎的Image对象存储到数据库中?

1 投票
3 回答
2122 浏览
提问于 2025-04-15 11:09

我在写代码的时候遇到了一些问题:

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 行限制。

撰写回答