在UploadHandler中进行图像转换并将其保存到Blobstore

时间:2013-08-09 04:44:05

标签: python image google-app-engine google-cloud-datastore blobstore

我有一个用Python编写的GAE页面,它(1)将一个jpg上传到blobstore。那部分有效。我现在需要做一个(2)我感觉幸运图像转换,然后(3)将它作为另一个blob存储在blobstore中。理想情况下,我想在同一个上传处理程序中执行(1),(2)和(3)。

我在这里遵循了代码,但它只做(1)和(2)。 https://developers.google.com/appengine/docs/python/images/#Python_Transforming_images_from_the_Blobstore

我看过SO,最接近我能找到的是: Storing Filtered images on the blobstore in GAE

它将转换保存到文件(使用Files API),然后将文件上载到blobstore。但是,它使用Files api,并且根据以下内容,不推荐使用Files API。 https://developers.google.com/appengine/docs/python/blobstore/#Python_Writing_files_to_the_Blobstore

在我的模型中,我有一个BlobKeyProperty,它存储对blobstore中图像的引用

class ImageModel(ndb.Model):
   imagetoserve =  ndb.BlobKeyProperty(indexed=False)

到目前为止,这是上传处理程序代码:

from google.appengine.ext import blobstore
from google.appengine.ext.webapp import blobstore_handlers
from google.appengine.api.images import get_serving_url
from google.appengine.api import images

upload_files = self.get_uploads('imgfile')  # 'file' is file upload field in the form
blob_info = upload_files[0]

imgtmp = images.Image(blob_info)
imgtmp.im_feeling_lucky()
img = ImageModel()
img.imagetoserve = imgtmp
img.put()

我的问题出在这一行:

img.imagetoserve = imgtmp

该模型是一个blobkeyproperty但我正在给它一个图像,显然导致类型不匹配的错误。如何将转换后的imgtmp上传到blobstore,捕获blobkey,并保存对模型的引用?

1 个答案:

答案 0 :(得分:1)

阅读Blobstore API Documentation

不幸的是,您通常会通过Files API完成此操作,但由于他们不赞成使用GCS,您可以执行以下操作(您可以填写缺失的部分):(来自this example

import cloudstorage as gcs
from google.appengine.ext import blobstore

class ImageModel(ndb.Model):
    image_filename = ndb.StringProperty(indexed=False)

    @property
    def imagetoserve(self):
        return blobstore.create_gs_key(self.image_filename)

BUCKET = "bucket_to_store_image\\"

with gcs.open(BUCKET + blob_info.filename, 'w', content_type='image/png') as f:
    f.write(imgtmp.execute_transforms())

img = ImageModel()
img.image_filename = BUCKET + blob_info.filename
img.put()