6

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

  • 首先,我通过 my @endpoint.methodas收到图像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 应用)

我的做法是因为我想保护我的用户的隐私。关于如何做好这件事的任何想法?我的代码片段通常来自谷歌开发者教程


编辑:

我看不到如何将 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

4

1 回答 1

2

我相信您想要作为字符串服务resource的对象是从 url 路径中检索的。BlobKey如果您查看google.appengine.ext.blobstore.BlobInfoget方法的源代码,则使用一个接受对象或字符串__normalize_and_convert_keys参数的函数。BlobKey

如果 blob 是图像,则最好将服务 url 发送到您的 Android 应用程序,StuffResponseMessage 在您的情况下。来自谷歌的 Serving a Blob 文档:

如果您要提供图像,一种更高效且成本可能更低的方法是使用App Engine Images API 而不是 send_blob来使用get_serving_url 。get_serving_url 函数可让您直接提供图像,而无需通过您的 App Engine 实例。

因此,在您保存图像后,将返回的blob_key(按照您save_image(data)上面的方法)制作一个服务 url,然后在您的 Android 应用程序中从返回的 url 中获取图像。这当然意味着在没有隐私保护的情况下公开图片网址。

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

于 2013-03-23T19:17:43.633 回答