我在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()来缓存动态转换后的图像图像......
答案 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)