Cloud Storage mit Java für die App Engine-Standardumgebung verwenden

In diesem Teil der Anleitung zu Bookshelf für Java erfahren Sie, wie Images in Cloud Storage gespeichert werden.

Diese Seite ist Teil einer mehrseitigen Anleitung. Wenn Sie dieses Beispiel von Beginn an durcharbeiten möchten, rufen Sie die Java Bookshelf-Anwendung auf und lesen Sie die Anleitung zur Einrichtung.

Cloud Storage-Bucket erstellen

In der folgenden Anleitung wird im Detail erläutert, wie Sie einen Cloud Storage-Bucket erstellen. Buckets sind die grundlegenden Container für Ihre Daten in Cloud Storage.

  1. Erstellen Sie in Ihrem Terminalfenster einen Cloud Storage-Bucket, wobei YOUR_BUCKET_NAME für den Namen Ihres Buckets steht:

    gsutil mb gs://YOUR_BUCKET_NAME
    
  2. Legen Sie für die standardmäßige Access Control List (ACL) des Buckets public-read fest, damit hochgeladene Bilder in der Bookshelf-Anwendung angezeigt werden.

    gsutil defacl set public-read gs://YOUR_BUCKET_NAME
    

App auf lokalem Computer ausführen

So führen Sie die App lokal aus:

  1. Geben Sie im Verzeichnis getting-started-java/bookshelf-standard/3-binary-data den folgenden Befehl ein, um einen lokalen Webserver zu starten:

    mvn package appengine:run -Dbookshelf.bucket=[YOUR-BUCKET]
    Ersetzen Sie [YOUR-BUCKET] durch Ihren Bucket-Namen.
  2. Rufen Sie in Ihrem Webbrowser http://localhost:8080/ auf.

Sie können jetzt auf den Webseiten der App stöbern, Bücher mit Titelbildern hinzufügen und Bücher bearbeiten und löschen.

App in der App Engine-Standardumgebung bereitstellen

So stellen Sie die App in der App Engine-Standardumgebung bereit:

  1. Um einen Datenspeicherindex zu erstellen, der in die Bookshelf-App hochgeladen wird, erstellen Sie mindestens ein Buch und klicken Sie dann auf Meine Bücher. Beachten Sie, dass beim Erstellen der App mit dem Befehl clean dieser lokale Index gelöscht wird. Führen Sie dies also beim Erstellen der App aus, die Sie bereitstellen möchten.
  2. Geben Sie im Verzeichnis getting-started-java/bookshelf-standard/3-binary-data diesen Befehl ein, um die App bereitzustellen:
  3. mvn appengine:deploy -Dappengine.appId=[YOUR-PROJECT-ID] -Dappengine.version=[YOUR-VERSION] -Dbookshelf.bucket=[YOUR-BUCKET].appspot.com
    Ersetzen Sie [YOUR-PROJECT-ID] durch Ihre Projekt-ID und [YOUR-VERSION] durch Ihre Version (zum Beispiel 1 oder 2) oder einen anderen zu verwendenden Stringwert.
  4. Geben Sie im Webbrowser die folgende URL ein:

    https://PROJECT_ID.REGION_ID.r.appspot.com

    Ersetzen Sie Folgendes:

Nachdem Sie Ihre App aktualisiert haben, können Sie die aktualisierte Version noch einmal bereitstellen. Geben Sie dazu denselben Befehl wie bei der ersten Bereitstellung der App ein und dieselbe Projekt-ID und Version an. Dadurch wird die aktuell bereitgestellte App überschrieben. Wenn Sie in der aktualisierten Befehlszeile einen anderen Versionsstring angeben, erstellt die neue Bereitstellung eine neue Version Ihrer App und befördert sie zur aktuell bereitgestellten Version.

Sie können die Kosten senken, indem Sie die nicht standardmäßigen Versionen der App löschen.

So löschen Sie eine Anwendungsversion:

  1. Rufen Sie in der Cloud Console die Seite Versionen für App Engine auf.

    Zur Seite "Versionen"

  2. Klicken Sie auf das Kästchen für die nicht standardmäßige App-Version, die Sie löschen möchten.
  3. Klicken Sie auf Löschen , um die Anwendungsversion zu löschen.

Ausführliche Informationen zum Bereinigen kostenpflichtiger Ressourcen finden Sie im letzten Schritt dieser Anleitung im Abschnitt Bereinigen.

App-Struktur

Binary data sample structure

Die App verwendet Cloud Storage, um Binärdaten, in diesem Fall Images, zu speichern. Die App verwendet Datastore weiterhin für Buchinformationen.

Code verstehen

In diesem Abschnitt werden der Anwendungscode und dessen Funktionsweise erläutert.

Nutzeruploads handhaben

Es ist einfach, die Cloud Storage API für Java zu verwenden. In den meisten Fällen benötigen Sie nur eine Zeile für die lokale Authentifizierung.

static {
  storage = StorageOptions.getDefaultInstance().getService();
}

Blobs in Cloud Storage hochladen

Prüfen Sie vor dem Hochladen, ob die Datei Ihren Anforderungen entspricht.


/**
 * Checks that the file extension is supported.
 */
private void checkFileExtension(String fileName) throws ServletException {
  if (fileName != null && !fileName.isEmpty() && fileName.contains(".")) {
    String[] allowedExt = {".jpg", ".jpeg", ".png", ".gif"};
    for (String ext : allowedExt) {
      if (fileName.endsWith(ext)) {
        return;
      }
    }
    throw new ServletException("file must be an image");
  }
}

Machen Sie den Dateinamen eindeutig, indem Sie einen Zeitstempel an ihn anhängen. Geben Sie mithilfe von storage.create eine BlobInfo weiter, die Sie mit bucketName und fileName erstellt haben, und konfigurieren Sie die Zugriffskontrollliste so, dass alle Nutzer den InputStream der Datei lesen und weitergeben können. Das Ergebnis ist eine öffentliche URL für das Objekt.

/**
 * Uploads a file to Google Cloud Storage to the bucket specified in the BUCKET_NAME
 * environment variable, appending a timestamp to end of the uploaded filename.
 */
@SuppressWarnings("deprecation")
public String uploadFile(FileItemStream fileStream, final String bucketName)
    throws IOException, ServletException {
  checkFileExtension(fileStream.getName());

  DateTimeFormatter dtf = DateTimeFormat.forPattern("-YYYY-MM-dd-HHmmssSSS");
  DateTime dt = DateTime.now(DateTimeZone.UTC);
  String dtString = dt.toString(dtf);
  final String fileName = fileStream.getName() + dtString;

  // the inputstream is closed by default, so we don't need to close it here
  BlobInfo blobInfo =
      storage.create(
          BlobInfo
              .newBuilder(bucketName, fileName)
              // Modify access list to allow all users with link to read file
              .setAcl(new ArrayList<>(Arrays.asList(Acl.of(User.ofAllUsers(), Role.READER))))
              .build(),
          fileStream.openStream());
  // return the public download link
  return blobInfo.getMediaLink();
}