Dateien mit Cloud Storage für C++ hochladen

Mit Cloud Storage for Firebase können Sie schnell und einfach Dateien in einen von Firebase bereitgestellten und verwalteten Bucket Cloud Storage hochladen.

Referenz erstellen

Wenn Sie eine Datei hochladen möchten, müssen Sie zuerst eine Cloud Storage-Referenz zum Speicherort in Cloud Storage erstellen, an den Sie die Datei hochladen möchten.

Sie können einen Verweis erstellen, indem Sie dem Stammverzeichnis Ihres Cloud Storage-Buckets untergeordnete Pfade anhängen:

// Create a root reference
StorageReference storage_ref = storage->GetReference();

// Create a reference to "mountains.jpg"
StorageReference mountains_ref = storage_ref.Child("mountains.jpg");

// Create a reference to 'images/mountains.jpg'
StorageReference mountain_images_ref = storage_ref.Child("images/mountains.jpg");

// While the file names are the same, the references point to different files
mountains_ref.name() == mountain_images_ref.name();           // true
mountains_ref.full_path() == mountain_images_ref.full_path(); // false

Sie können keine Daten mit einer Referenz auf die Wurzel Ihres Cloud Storage-Buckets hochladen. Die Referenz muss auf eine untergeordnete URL verweisen.

Dateien hochladen

Sobald Sie eine Referenz haben, können Sie Dateien auf zwei Arten in Cloud Storage hochladen:

  1. Über einen Byte-Puffer im Arbeitsspeicher hochladen
  2. Über einen Dateipfad, der eine Datei auf dem Gerät darstellt, hochladen

Aus Daten im Arbeitsspeicher hochladen

Die PutData()-Methode ist die einfachste Möglichkeit, eine Datei in Cloud Storage hochzuladen. PutData() nimmt einen Byte-Puffer entgegen und gibt einen Future<Metadata> zurück, der Informationen zur Datei enthält, sobald der Future abgeschlossen ist. Mit einer Controller können Sie Ihren Upload verwalten und den Status im Blick behalten.

// Data in memory
const size_t kByteBufferSize = ...
uint8_t byte_buffer[kByteBufferSize] = { ... };

// Create a reference to the file you want to upload
StorageReference rivers_ref = storage_ref.Child("images/rivers.jpg");

// Upload the file to the path "images/rivers.jpg"
Future future = rivers_ref.PutBytes(byte_buffer, kByteBufferSize);

Die Anfrage wurde bereits gesendet, aber wir müssen warten, bis die Zukunft abgeschlossen ist, bevor die Datei hochgeladen wird. Da Spiele in der Regel in einer Schleife ausgeführt werden und weniger Callback-gesteuert sind als andere Anwendungen, wird in der Regel der Abschluss abgefragt.

if (future.status() != firebase::kFutureStatusPending) {
  if (future.status() != firebase::kFutureStatusComplete) {
    LogMessage("ERROR: GetData() returned an invalid future.");
    // Handle the error...
  } else if (future.Error() != firebase::storage::kErrorNone) {
    LogMessage("ERROR: GetData() returned error %d: %s", future.Error(),
               future.error_message());
    // Handle the error...
    }
  } else {
    // Metadata contains file metadata such as size, content-type, and download URL.
    Metadata* metadata = future.Result();
    std::string download_url = metadata->download_url();
  }
}

Von einer lokalen Datei hochladen

Mit der Methode PutFile() können Sie lokale Dateien wie Fotos und Videos von der Kamera auf die Geräte hochladen. PutFile() nimmt einen std::string als Pfad zur Datei an und gibt eine Future<Metadata> zurück, die Informationen zur Datei enthält, sobald die Future abgeschlossen ist. Mit einer Controller können Sie Ihren Upload verwalten und den Status beobachten.

// File located on disk
std::string local_file = ...

// Create a reference to the file you want to upload
StorageReference rivers_ref = storage_ref.Child("images/rivers.jpg");

// Upload the file to the path "images/rivers.jpg"
Future future = rivers_ref.PutFile(localFile);

// Wait for Future to complete...

if (future.Error() != firebase::storage::kErrorNone) {
  // Uh-oh, an error occurred!
} else {
  // Metadata contains file metadata such as size, content-type, and download URL.
  Metadata* metadata = future.Result();
  std::string download_url = metadata->download_url();
}

Wenn Sie Ihren Upload aktiv verwalten möchten, können Sie den Methoden PutFile() oder PutBytes() eine Controller übergeben. So können Sie den laufenden Uploadvorgang über den Controller beobachten. Weitere Informationen finden Sie unter Uploads verwalten.

Dateimetadaten hinzufügen

Sie können auch Metadaten beim Hochladen von Dateien angeben. Diese Metadaten enthalten typische Dateimetadateneigenschaften wie name, size und content_type (allgemein als MIME-Typ bezeichnet). Bei der PutFile()-Methode wird der Inhaltstyp automatisch anhand der Dateinamenerweiterung abgeleitet. Sie können den automatisch erkannten Typ jedoch überschreiben, indem Sie content_type in den Metadaten angeben. Wenn Sie keinen content_type angeben und Cloud Storage keinen Standard aus der Dateiendung ableiten kann, verwendet Cloud Storage application/octet-stream. Weitere Informationen zu Dateimetadaten finden Sie im Abschnitt Dateimetadaten verwenden.

// Create storage reference
StorageReference mountains_ref = storage_ref.Child("images/mountains.jpg");

// Create file metadata including the content type
StorageMetadata metadata;
metadata.set_content_type("image/jpeg");

// Upload data and metadata
mountains_ref.PutBytes(data, metadata);

// Upload file and metadata
mountains_ref.PutFile(local_file, metadata);

Uploads verwalten

Mit den Methoden Pause(), Resume() und Cancel() auf Controller kannst du nicht nur Uploads starten, sondern auch pausieren, fortsetzen und abbrechen. Diese Methoden kannst du optional an die Methoden PutBytes() oder PutFile() übergeben.

// Start uploading a file
firebase::storage::Controller controller;
storage_ref.Child("images/mountains.jpg").PutFile(local_file, nullptr, &controller);

// Pause the upload
controller.Pause();

// Resume the upload
controller.Resume();

// Cancel the upload
controller.Cancel();

Uploadfortschritt im Blick behalten

Sie können Listener an Uploads anhängen, um den Fortschritt des Uploads zu verfolgen.

class MyListener : public firebase::storage::Listener {
 public:
  virtual void OnProgress(firebase::storage::Controller* controller) {
    // A progress event occurred
  }
};

{
  // Start uploading a file
  MyEventListener my_listener;
  storage_ref.Child("images/mountains.jpg").PutFile(local_file, my_listener);
}

Fehlerbehandlung

Es kann verschiedene Gründe für Fehler beim Upload geben, z. B. dass die lokale Datei nicht vorhanden ist oder der Nutzer keine Berechtigung zum Hochladen der gewünschten Datei hat. Weitere Informationen zu Fehlern finden Sie im Abschnitt Fehler beheben.

Nächste Schritte

Nachdem Sie Dateien hochgeladen haben, erfahren Sie nun, wie Sie sie von Cloud Storage herunterladen.