通过app-engine端点api提供blobstore映像

时间:2013-03-22 04:31:17

标签: android google-app-engine python-2.7 blobstore google-cloud-endpoints

我正在构建一个app-engine端点api,它从用户(Android应用程序)获取图片并以编程方式将其保存到blobstore。然后我将blob_key保存在我的数据存储区中。代码如下:

  • 首先,我通过@endpoint.method作为messages.BytesField收到了图片:

    image_data = messages.BytesField(1,required = True)

然后我像这样保存到blobstore:

from google.appengine.api import files

def save_image(data):
  # Create the file
  file_name = files.blobstore.create(mime_type='image/png')

  # Open the file and write to it
  with files.open(file_name, 'a') as f:
    f.write('data')

  # Finalize the file. Do this before attempting to read it.
  files.finalize(file_name)

  # Get the file's blob key
  blob_key = files.blobstore.get_blob_key(file_name)
  return blob_key # which is then saved to datastore

现在我想重新提供图像。我不知道如何将以下代码放入我的端点api:

from google.appengine.ext import blobstore
from google.appengine.ext.webapp import blobstore_handlers
class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler):
  def get(self, resource):
    resource = str(urllib.unquote(resource))
    blob_info = blobstore.BlobInfo.get(resource)
    self.send_blob(blob_info)

最后,我想象一个像这样的服务程序:

    @ endpoints.method中的
  • 从数据存储区获取blob_key

  • 使用blob_key获取图像

  • 将图像添加到StuffResponseMessage

  • 将StuffResponseMessage发送到前端(android app)

我的方法是因为我想保护用户的隐私。有关如何做到这一点的任何想法? My code snippets are generally from the google developer tutorial


编辑:

我不知道如何将数据存储区中的blob_key传递给以下方法来检索图像:

from google.appengine.ext import blobstore
from google.appengine.ext.webapp import blobstore_handlers
class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler):
  def get(self, resource):
    resource = str(urllib.unquote(resource))
    blob_info = blobstore.BlobInfo.get(resource)
    self.send_blob(blob_info)

无论如何,resource里面有什么?

1 个答案:

答案 0 :(得分:2)

我相信resource是您想要投放的BlobKey对象,作为字符串,从网址路径中检索。如果查看google.appengine.ext.blobstore.BlobInfo的来源,get方法使用的函数__normalize_and_convert_keys采用BlobKey对象或字符串的参数。

如果blob是一张图片,也许最好将服务网址发送到您的Android应用,StuffResponseMessage也许就是你的情况。来自谷歌的服务blob doc:

  

如果您正在提供图像,则更有效且可能更便宜的方法是使用App Engine Images API而不是send_blob来使用get_serving_url。 get_serving_url函数允许您直接提供图像,而无需通过App Engine实例。

因此,在保存图片后,按照返回的blob_key(根据您的方法save_image(data)制作服务网址),然后在Android应用中获取返回网址的图片。这当然意味着在没有隐私保护的情况下暴露图像网址。

如果您想要保护,请使用BlobReader class来读取带有类似接口的文件的blob。您不能使用Serving Blob示例中的方法/类,因为您在remote.Service子类而不是处理程序中执行此操作。