Sirviendo la imagen de blobstore a través de los extremos del app-engine api
Estoy construyendo una API api del app-engine que toma la foto de un usuario (aplicación android) y la guarda en blobstore mediante programación. A continuación, guardar la blob_key en mi almacén de datos. El código es el siguiente:
-
Primero recibí la imagen a través de mi
@endpoint.method
comomessages.BytesField
:- Autenticación personalizada en Google Cloud Mobile Backend Starter en Android
- Appengine conectado proyecto android muerto a la llegada
- google endpoint use Explorer con una API HTTP local
- El nombre de GoogleAccountCredential es nulo a pesar de llamar a setSelectedAccountName (Android 6.0)
- Qué plataforma MBaaS utilizar para un proyecto específico: Parse o Google Cloud
Image_data = messages.BytesField (1, required = True)
Luego guardo en el blobstore como este:
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
Ahora quiero servir la imagen de nuevo. No veo cómo encajar el siguiente código en mis puntos finales 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)
Al final me imagino un procedimiento de servicio como este:
-
En @ endpoints.method:
-
Obtener blob_key desde el almacén de datos
-
Obtener la imagen con blob_key
-
Agregar imagen a StuffResponseMessage
-
Envíe StuffResponseMessage al front-end (aplicación para Android)
Mi enfoque es porque quiero proteger la privacidad de mis usuarios. ¿Alguna idea sobre cómo hacerlo bien? Mis fragmentos de código son generalmente del tutorial de desarrollador de google .
EDITAR:
No veo cómo pasaría la blob_key desde el almacén de datos al siguiente método para recuperar la imagen:
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)
¿Qué hay dentro de los resource
, de todos modos?
- Src / main / webapp / WEB-INF no aparece en Android Studio
- EOFException durante el uso de puntos finales de google
- Android Studio: ¿dónde "Install Client Libraries" para Cloud Endpoints?
- Cómo mover Cloud Endpoints generó la biblioteca sources.jar en el proyecto de Android
- Error de GLS: INVALID_AUDIENCE en los puntos finales de la nube de google
- Endpoints de Google App Engine Cloud userId es nulo
- Google Endpoints Android con Python Backend
- ¿Tengo que usar CollectionResponse como un tipo de retorno en GAE Endpoints API o puedo usar colecciones java de entidades?
Creo que el resource
es el objeto BlobKey
de lo que desea servir, como una cadena, retirada de url path. Si observa el origen de google.appengine.ext.blobstore.BlobInfo
el método get
utiliza una función __normalize_and_convert_keys
que toma un argumento del objeto BlobKey
OR string.
Si el blob es una imagen, tal vez sea mejor enviar la URL de servicio a su aplicación de Android, en StuffResponseMessage
tal vez en su caso. De Google Serving a Blob doc:
Si está sirviendo imágenes, un método más eficiente y potencialmente menos costoso es usar get_serving_url usando la API de imágenes de App Engine en lugar de send_blob. La función get_serving_url le permite publicar la imagen directamente, sin tener que pasar por las instancias de App Engine.
Así que después de guardar la imagen, tome la blob_key
devuelta (como por su método save_image(data)
arriba) para hacer una url de servicio, luego en su aplicación para Android obtenga la imagen de la URL devuelta. Eso por supuesto significa exponer la url de la imagen sin la protección de la aislamiento.
Si desea hacerlo con protección, utilice la clase BlobReader
para leer el blob con el archivo como interfaz. No puede utilizar el método / clase de Servir un ejemplo de Blob porque lo hace en una subclase remote.Service
lugar de un manejador.