2013-08-20 14 views
6

Ho scritto un'applicazione di Google App Engine che utilizza Blobstore per salvare i dati generati a livello di programmazione. Per farlo, ho utilizzato lo Files API, che purtroppo è stato ritirato a favore di Google Cloud Storage. Quindi sto riscrivendo la mia classe helper per lavorare con GCS.Ottieni un file Google Cloud Storage dal suo BlobKey

Mi piacerebbe mantenere l'interfaccia il più possibile simile a prima, anche perché mantengo BlobKeys nel Datastore per mantenere i riferimenti ai file (e cambiare il modello di un'applicazione di produzione è sempre doloroso). Quando salvo qualcosa da GCS, posso recuperare un BlobKey con

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

come prescritto here, e io insisto nel Datastore.

Quindi ecco la domanda: la documentazione mi dice come servire un file GCS con blobstoreService.serve(blobKey, resp); in una risposta servlet, MA come posso recuperare il contenuto del file (come InputStream, array di byte o qualsiasi altra cosa) per usarlo nel mio codice per ulteriore elaborazione? Nella mia attuale implementazione lo faccio con una lettura FileReadChannel da un AppEngineFile (entrambi deprecati).

risposta

3

Ecco il codice per aprire un oggetto di archiviazione di Google come flusso di input. Purtroppo, è necessario utilizzare il nome secchio e nome dell'oggetto e non il blob chiave

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

Grazie! Speravo di ottenere il contenuto usando BlobKey, ma se non c'è modo di farlo, io (ugh) refactor il mio modello per includere il nome dell'oggetto –

0

È possibile ottenere il nome del file cloud storage solo nel gestore di upload (fileInfo.gs_object_name) e memorizzarlo nel database. Dopo che è perso e sembra non essere conservato in BlobInfo o altre strutture di metadati.

Google dice: A differenza di metadati BlobInfo metadati FileInfo non viene mantenuto a datastore. (Non è presente alcuna chiave blob, ma è possibile crearne una in seguito, se necessario, chiamando create_gs_key.) È necessario salvare gs_object_name nel proprio gestore di caricamento o questi dati andranno persi.

Siamo spiacenti, questo è un collegamento Python, ma dovrebbe essere facile trovare qualcosa di simile in Java. https://developers.google.com/appengine/docs/python/blobstore/fileinfoclass

3

Dato un blobKey, utilizzare la classe BlobstoreInputStream per leggere il valore da blobstore, come descritto nella documentation:

BlobstoreInputStream in = new BlobstoreInputStream(blobKey); 
0

Qui è l'approccio blobstore (scusate, questo è per Python, ma sono certo lo trovi abbastanza simile per Java):

blob_reader = blobstore.BlobReader(blob_key) 
if blob_reader: 
    file_content = blob_reader.read()