2013-08-20 19 views
6

Napisałem aplikację Google App Engine, która korzysta z Blobstore do zapisywania danych wygenerowanych programowo. Aby to zrobić, skorzystałem z wersji Files API, która została niestety wycofana na rzecz Google Cloud Storage. Tak więc przepisuję moją klasę pomocników do pracy z GCS.Pobierz plik Google Cloud Storage z BlobKey

Chciałbym, aby interfejs był jak najbardziej podobny do poprzedniego, także dlatego, że utrzymuję BlobKeys w Datastore, aby zachować odniesienia do plików (a zmiana modelu aplikacji produkcyjnej jest zawsze bolesna). Kiedy zapisać coś do OWS, i odzyskać BlobKey z

BlobKey blobKey = blobstoreService.createGsBlobKey("/gs/" + fileName.getBucketName() + "/" + fileName.getObjectName()); 

jak przepisane here, i utrzymują go w magazynie danych.

Oto więc pytanie: dokumentacja mówi mi, jak obsłużyć plik GCS z blobstoreService.serve(blobKey, resp); w odpowiedzi serwletu, ALE jak mogę pobrać zawartość pliku (jako InputStream, tablica bajtów lub cokolwiek innego), aby użyć go w moim kodzie dla dalsze przetwarzanie? W mojej obecnej wersji robię to z odczytem FileReadChannel z AppEngineFile (oba przestarzałe).

Odpowiedz

3

Oto kod służący do otwierania obiektu pamięci masowej Google jako strumienia wejściowego. Niestety, trzeba używać nazwy wiadro i nazwę obiektu, a nie blob klucza

GcsFilename gcs_filename = new GcsFilename(bucket_name, object_name); 
GcsService service = GcsServiceFactory.createGcsService(); 
ReadableByteChannel rbc = service.openReadChannel(gcs_filename, 0); 
InputStream stream = Channels.newInputStream(rbc); 
+0

Dziękujemy! Miałem nadzieję, że uda mi się uzyskać zawartość za pomocą BlobKey, ale jeśli nie ma sposobu, aby to zrobić, to (ugh) zmodyfikuję mój model tak, aby zawierał nazwę obiektu –

0

można uzyskać tylko w pliku chmura publiczna obsługi przesyłania (fileInfo.gs_object_name) i zapisać go w swojej bazie danych. Po tym jest utracone i wydaje się, że nie jest zachowane w BlobInfo lub innych strukturach metadanych.

mówi Google: przeciwieństwie metadanych BlobInfo metadanych FileInfo nie jest zachowywane do magazynu danych. (Nie ma również klucza typu blob, ale możesz go utworzyć później, jeśli to konieczne, wywołując create_gs_key.) Musisz zapisać nazwę gs_object_name w swoim module obsługi plików lub te dane zostaną utracone.

Niestety, jest to link Pythona, ale powinno być łatwo znaleźć coś podobnego w java. https://developers.google.com/appengine/docs/python/blobstore/fileinfoclass

0

Oto podejście Blobstore (przepraszam, to jest dla Pythona, ale jestem z pewnością uważasz, że jest podobny do Javy):

blob_reader = blobstore.BlobReader(blob_key) 
if blob_reader: 
    file_content = blob_reader.read() 
Powiązane problemy