2017-06-01 10 views
0

Ich bin sehr neu auf der GC-Plattform und versuche, eine API in Java mit zwei Methoden zu erstellen: eine, die eine Liste aller Dateien in einem bestimmten Bucket und eine andere, die eine zurückgibt angegebene Datei aus diesem Bucket. Ziel ist es, die Dateiliste iterieren zu können, um jede Datei aus dem Bucket herunterladen zu können. Im Wesentlichen möchte ich den Inhalt des Buckets auf einem Android-Gerät spiegeln, sodass die API von einer generierten Client-Bibliothek in einer Android-App aufgerufen wird. Meine getFileList() Methode gibt ein ListResult Objekt zurück. Wie extrahiere ich eine Liste von Dateien daraus?Google Cloud Endpoint Bucket Downloader

@ApiMethod(name = "getFileList", path = "getFileList", httpMethod = ApiMethod.HttpMethod.GET) 
public ListResult getFileList(@Named("bucketName") String bucketName) { 
    GcsService gcsService = GcsServiceFactory.createGcsService(RetryParams.getDefaultInstance()); 
    ListResult result = null; 
    try { 
     result = gcsService.list(bucketName, ListOptions.DEFAULT); 
     return result; 
    } catch (IOException e) { 
     return null; // Handle this properly. 
    } 
} 

Außerdem bin ich kämpfen, um zu bestimmen, was der Rückgabetyp meiner getFile() API-Methode sein sollte. Ich kann kein Byte-Array verwenden, da Rückgabetypen keine einfachen Typen sein können, wie ich es verstehe. Dies ist, wo ich mit ihm bin:

@ApiMethod(name = "getFile", path = "getFile", httpMethod = ApiMethod.HttpMethod.GET) 
public byte[] getFile(@Named("bucketName") String bucketName, ListItem file) { 
    GcsService gcsService = GcsServiceFactory.createGcsService(); 
    GcsFilename gcsFilename = new GcsFilename(bucketName, file.getName()); 
    ByteBuffer byteBuffer; 
    try { 
     int fileSize = (int) gcsService.getMetadata(gcsFilename).getLength(); 
     byteBuffer = ByteBuffer.allocate(fileSize); 
     GcsInputChannel gcsInputChannel = gcsService.openReadChannel(gcsFilename, 0); 
     gcsInputChannel.read(byteBuffer); 
     return byteBuffer.array(); 
    } catch (IOException e) { 
     return null; // Handle this properly. 
    } 
} 

ich für diese Sachen in der Google-Dokumentation bin verloren und bin besorgt darüber, dass ich es, da alle aus völlig falschen Richtung komme ich sicher zu tun versuche, ist ein Download Haufen von Dateien!

Antwort

1

Ich kann Ihnen keine vollständige Lösung geben, weil dies Code ist, den ich für meine Firma geschrieben habe, aber ich kann Ihnen einige Grundlagen zeigen. Ich benutze die google-cloud-java API.

Zunächst müssen Sie einen API-Schlüssel erstellen und diesen im JSON-Format herunterladen. Mehr Details can be found here.

Ich habe - unter anderem - diese beiden Felder in meiner Klasse:

protected final Object storageInitLock = new Object(); 
protected Storage storage; 

Zuerst Sie eine Methode benötigt ein com.google.cloud.storage.Storage Objekt, so etwas wie (Set-Projekt-ID und den Pfad zu json api Schlüssel zu initialisieren):

protected final Storage getStorage() { 
    synchronized (storageInitLock) { 
     if (null == storage) { 
      try { 
       storage = StorageOptions.newBuilder() 
         .setProjectId(PROJECTID) 
         .setCredentials(ServiceAccountCredentials.fromStream(new FileInputStream(pathToJsonKey))) 
         .build() 
         .getService(); 
      } catch (IOException e) { 
       throw new MyCustomException("Error reading auth file " + pathToJsonKey, e); 
      } catch (StorageException e) { 
       throw new MyCustomException("Error initializing storage", e); 
      } 
     } 

     return storage; 
    } 
} 

alle Einträge bekommen Sie so etwas wie verwenden:

protected final Iterator<Blob> getAllEntries() { 
    try { 
     return getStorage().list(bucketName).iterateAll(); 
    } catch (StorageException e) { 
     throw new MyCustomException("error retrieving entries", e); 
    } 
} 

Listendateien in einem Verzeichnis:

public final Optional<Page<Blob>> listFilesInDirectory(@NotNull String directory) { 
    try { 
     return Optional.ofNullable(getStorage().list(getBucketName(), Storage.BlobListOption.currentDirectory(), 
       Storage.BlobListOption.prefix(directory))); 
    } catch (Exception e) { 
     return Optional.empty(); 
    } 
} 

erhalten Informationen über eine Datei:

public final Optional<Blob> getFileInfo(@NotNull String bucketFilename) { 
    try { 
     return Optional.ofNullable(getStorage().get(BlobId.of(getBucketName(), bucketFilename))); 
    } catch (Exception e) { 
     return Optional.empty(); 
    } 
} 

Hinzufügen einer Datei:

public final void addFile(@NotNull String localFilename, @NotNull String bucketFilename, 
           @Nullable ContentType contentType) { 
    final BlobInfo.Builder builder = BlobInfo.newBuilder(BlobId.of(bucketName, bucketFilename)); 
    if (null != contentType) { 
     builder.setContentType(contentType.getsValue()); 
    } 
    final BlobInfo blobInfo = builder.build(); 

    try (final RandomAccessFile raf = new RandomAccessFile(localFilename, "r"); 
     final FileChannel channel = raf.getChannel(); 
     final WriteChannel writer = getStorage().writer(blobInfo)) { 

     writer.write(channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size())); 
    } catch (Exception e) { 
     throw new MyCustomException(MessageFormat.format("Error storing {0} to {1}", localFilename, 
       bucketFilename), e); 
    } 
} 

ich diese Code-Schnipsel hoffen und die referenzierte Dokumentation wird mach dich auf, es ist nicht so schwer.

+0

Großartig. Vielen Dank dafür! Ich werde dich wissen lassen, wie ich weitergehe ... – user3352488

+0

habe nur eine kleine Änderung an der 'getStorage()' Methode gemacht, für fazile init; Ich habe das in meinem Code und habe es zuerst entfernt; –

Verwandte Themen