6

Buduję api punktu końcowego silnika aplikacji, który pobiera obraz od użytkownika (aplikacja dla systemu Android) i zapisuje go programowo w blobstore. Następnie zapisuję przycisk blob_key w moim magazynie danych. Kod wygląda tak:Wyświetlanie obrazu blobstore za pośrednictwem punktów końcowych aplikacji api

  • Najpierw dostałam obraz poprzez mój @endpoint.method jako messages.BytesField:

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

Potem Zapisz do blobstore w ten sposób:

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 

Teraz chcę służyć obrazowi plecy. Nie widzę, jak dopasować następujący kod do mojego punktów końcowych 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) 

w końcu wyobrazić serwującą procedurę takiego:

  • w @ endpoints.method:

  • get blob_key z magazynu danych

  • uzyskać obraz z blob_key

  • dodać zdjęcie do StuffResponseMessage

  • wyślij StuffResponseMessage do front-end (Android app)

Moje podejście, ponieważ chcę, aby chronić prywatność swoich użytkowników. Wszelkie przemyślenia na temat tego, jak to zrobić dobrze? My code snippets are generally from the google developer tutorial.


EDIT:

nie widzę jak bym zdać blob_key z magazynu danych w następujący sposób, aby pobrać obraz:

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) 

Co znajduje się wewnątrz resource, tak?

+1

Nie potrzebujesz 'from __future__ import with_statement', jeśli używasz Pythona 2.7. – bossylobster

+0

ah. Dzięki, @bossylobster. Wyciągnąłem to. – learner

Odpowiedz

2

Wierzę, że resource jest obiektem o numerze BlobKey, który jest przesyłany z adresu URL. Jeśli spojrzy się na źródło google.appengine.ext.blobstore.BlobInfo, metoda get wykorzystuje funkcję __normalize_and_convert_keys, która przyjmuje argument OR2 string obiektu BlobKey.

Jeśli obiekt typu blob jest obrazem, być może najlepiej jest wysłać adres URL wyświetlania do aplikacji na Androida, może w Twoim przypadku jest to StuffResponseMessage. Od Google Serving doc Blob:

Jeśli porcja zdjęć, bardziej wydajna i potencjalnie mniej kosztowna metoda polega na użyciu get_serving_url pomocą App Engine Obrazy API zamiast send_blob. Funkcja get_serving_url pozwala wyświetlać obraz bezpośrednio, bez konieczności przechodzenia przez instancje App Engine.

Więc po zapisaniu obrazu, wziąć wracającą blob_key (jak na swoje metody save_image(data) powyżej), aby służąc URL, a następnie w aplikacji na Androida uzyskać obraz ze zwróconego URL. To oczywiście oznacza odsłonięcie adresu URL obrazu bez ochrony prywatności.

Jeśli chcesz zrobić to z ochroną, użyj BlobReaderclass, aby przeczytać blob z interfejsem podobnym do pliku. Nie możesz użyć metody/class z przykładu Serving a Blob, ponieważ robisz to w podklasie remote.Service, a nie w procedurze obsługi.

+0

Aby wysłać obiekt typu blob z punktu końcowego (serwera) do systemu Android, czy muszę go zakodować? (Base64) lub jest już obsługiwane? – learner

+0

@learner podając adres URL do obsługi, możesz obsłużyć go jak każdy inny obraz zewnętrzny. Zobacz tę odpowiedź [Pobieranie obrazu Androida] (http://stackoverflow.com/a/2909460/1522990) – panjiesw

Powiązane problemy