在blobstore中制作图像的副本

时间:2012-06-07 16:18:45

标签: google-app-engine python-2.7 blobstore

我在blob商店中有一张图片,由用户上传(他们的个人资料图片)。我想制作相同的副本并重新调整副本的大小,以便它可以显示为缩略图。我想制作相同的副本而不是使用ImageService,因为与配置文件图像相比,这种情况会更频繁地使用。

我在这里做的是:

reader = profile_image.open() #get binary data from blob
data = reader.read()

file_name = files.blobstore.create(mime_type=profile_image.content_type)#file to write to

with files.open(file_name, 'a') as f:
   f.write(data)

files.finalize(file_name)


blob_key = files.blobstore.get_blob_key(file_name)

image = images.Image(blob_key = blob_key)
image.resize(width=32, height=32)

entity.small_profile_pic = <MyImageModel>(caption=<caption given by user>,
                                       picture=str(blob_key))

这给了我错误:

BadValueError: Image instance must have a complete key before it can be stored as a reference.

我认为这是因为blob没有保存(put())到数据存储区,但是我该怎么做。 Doed files.blobstore.get_blob_key(file_name)没有这样做?

我还想问一下:blobstore是否也使用get_serving_url()来缓存动态转换后的图像图像......

1 个答案:

答案 0 :(得分:4)

我会使用get_serving_url方法。在doc中声明:

  

get_serving_url()方法允许您生成稳定的专用URL,以提供适合Web的图像缩略图。您只需在Blobstore中存储原始图像的单个副本,然后请求高性能的每个图像URL。此特殊URL可以为自动调整大小和/或裁剪的图像提供服务,从此URL提供服务不会在应用程序上产生任何CPU或动态服务负载(尽管带宽仍然照常收费)。通过高度优化的无cookie基础架构为图像提供低延迟。

您发布的代码似乎也不遵循文档中发布的示例。我会用这样的东西

img = images.Image(blob_key=original_image_key)
img.resize(width=32, height=32)
thumbnail = img.execute_transforms(output_encoding=images.JPEG)
file_name = files.blobstore.create(mime_type='image/jpeg')#file to write to
with files.open(file_name, 'a') as f: 
    f.write(thumbnail)
files.finalize(file_name)
blob_key = files.blobstore.get_blob_key(file_name)