我正在构建一个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)
最后,我想象一个像这样的服务程序:
:
从数据存储区获取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
里面有什么?
答案 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
子类而不是处理程序中执行此操作。