Per coloro che cercano di ottenere Google Cloud Storage per lavorare a tutti dal loro server di sviluppo Java di app locali, ho pensato una risposta più sarebbe utile. Sono riuscito a far funzionare il mio app server di sviluppo locale con Google Cloud Storage non locale, ma sto solo scavando nel codice e capendo cosa era necessario: non sembra esserci documentazione su questo.
L'obiettivo sarà quello di ottenere questo blocco di codice a lavorare a livello locale, che legge un file da GCS:
GcsService gcsService =
GcsServiceFactory.createGcsService(RetryParams.getDefaultInstance());
int fileSize = (int) gcsService.getMetadata(gcsFilename).getLength();
ByteBuffer byteBuffer = ByteBuffer.allocate(fileSize);
GcsInputChannel inputChannel = gcsService.openReadChannel(gcsFilename, 0);
int readResult = inputChannel.read(byteBuffer);
byte[] fileBytes = byteBuffer.array();
Se si tenta di farlo a livello locale, non troverete tutti i file che avete caricare su GCS, perché tenterà di utilizzare un GCS falso locale. Sfortunatamente, non ho trovato un buon modo per caricare su questo GCS locale, quindi non è molto utile (non esiste un file explorer per questo come nella versione cloud, e gsutil non funziona per questo). Quindi, invece, lo faremo funzionare con GCS non locali (cloud) durante l'esecuzione nel server dell'app locale di sviluppo.
Per fare ciò, si noti che GcsService creato in com.google.appengine.tools.cloudstorage.GcsServiceFactory da questo blocco di codice:
if (location == SystemProperty.Environment.Value.Production || hasCustomAccessTokenProvider()) {
rawGcsService = OauthRawGcsServiceFactory.createOauthRawGcsService(builder.build());
} else if (location == SystemProperty.Environment.Value.Development) {
rawGcsService = LocalRawGcsServiceFactory.createLocalRawGcsService();
È possibile che questo
dice che è necessario specificare un token di accesso personalizzato fornitore per ottenere il servizio non locale, cosa che si fa definendo una proprietà di sistema. Per un app App Engine, è possibile farlo in AppEngine-web.xml in questo modo:
<system-properties>
<property name="gcs_access_token_provider" value="com.mypackage.MyAccessTokenProvider" />
</system-properties>
Il valore di tale proprietà è una classe si definisce che implementa com.google.appengine.tools.cloudstorage.oauth.AccessTokenProvider, che fornisce il token di accesso per la tua app. Questa classe deve creare un GoogleCredential, che può essere utilizzato per recuperare un token di accesso, utilizzando le istruzioni per "Altro" per un GoogleCredential su https://developers.google.com/identity/protocols/OAuth2ServiceAccount#authorizingrequests.
Ora creerà un servizio Gcs OAuth che comunica con il cloud e non è necessario utilizzare la memoria locale falsa.
Non penso che sia necessario ottenere la libreria client. È necessario farlo solo se, beh, è necessario accedere al negozio attraverso le funzioni della libreria. Sto scrivendo al negozio usando il blobstore, quindi non ho bisogno della libreria client. Sembra che impostare i bucket avvenga automaticamente quando li si utilizza, quindi non è necessaria alcuna installazione. Vedi la mia risposta. – user2771609