1

我在 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())到数据存储中,但我该怎么做。没有files.blobstore.get_blob_key(file_name)做吗?

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

4

1 回答 1

4

我会使用 get_serving_url 方法。在文档中指出:

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)
于 2012-06-07T17:26:06.010 回答