Scarica file con Cloud Storage per C++

Cloud Storage for Firebase ti consente di scaricare file in modo rapido e semplice da un bucket Cloud Storage fornito e gestito da Firebase.

Crea un riferimento

Per scaricare un file, crea innanzitutto un riferimento Cloud Storage per il file che desideri scaricare.

Puoi creare un riferimento aggiungendo percorsi secondari alla radice del tuo bucket Cloud Storage oppure puoi creare un riferimento da un URL gs:// o https:// esistente che fa riferimento a un oggetto in Cloud Storage.

// Create a reference with an initial file path and name
StorageReference path_reference = storage->GetReference("images/stars.jpg");

// Create a reference from a Cloud Storage URI
StorageReference gs_reference = storage->GetReferenceFromUrl("gs://bucket/images/stars.jpg");

// Create a reference from an HTTPS URL
// Note that in the URL, characters are URL escaped!
StorageReference https_reference = storage->GetReferenceFromUrl("https://firebasestorage.googleapis.com/b/bucket/o/images%20stars.jpg");

Scaricare files

Una volta ottenuto un riferimento, puoi scaricare file da Cloud Storage in tre modi:

  1. Scarica in un buffer in memoria
  2. Scaricalo in un percorso specifico sul dispositivo
  3. Genera una stringa URL che rappresenta il file online

Scarica in memoria

Scaricare il file in un buffer di byte in memoria utilizzando il metodo GetBytes() . Questo è il modo più semplice per scaricare rapidamente un file, ma è necessario caricare in memoria l'intero contenuto del file. Se richiedi un file più grande della memoria disponibile dell'app, l'app si bloccherà. Per proteggerti da problemi di memoria, assicurati di impostare la dimensione massima su qualcosa che sai che la tua app può gestire o utilizza un altro metodo di download.

// Create a reference to the file you want to download
StorageReference island_ref = storage_ref.Child("images/island.jpg");

// Download in memory with a maximum allowed size of 1MB (1 * 1024 * 1024 bytes)
const size_t kMaxAllowedSize = 1 * 1024 * 1024
int8_t byte_buffer[kMaxAllowedSize];
firebase::Future future = island_ref.GetBytes(byte_buffer, kMaxAllowedSize);

Al momento la richiesta è stata effettuata ma dobbiamo attendere il completamento di Future prima di poter leggere il file. Poiché i giochi in genere vengono eseguiti in loop e sono meno guidati da callback rispetto ad altre applicazioni, in genere verrà eseguito il polling per il completamento.

// In the game loop that polls for the result...

if (future.status() != firebase::kFutureStatusPending) {
  if (future.status() != firebase::kFutureStatusComplete) {
    LogMessage("ERROR: GetBytes() returned an invalid future.");
    // Handle the error...
  } else if (future.Error() != firebase::storage::kErrorNone) {
    LogMessage("ERROR: GetBytes() returned error %d: %s", future.Error(),
               future.error_message());
    // Handle the error...
  } else {
    // byte_buffer is now populated with data for "images/island.jpg"
  }
}

Scarica in un file locale

Il metodo GetFile() scarica un file direttamente su un dispositivo locale. Utilizzalo se i tuoi utenti desiderano avere accesso al file mentre sono offline o per condividerlo in un'altra app.

// Create a reference to the file you want to download
StorageReference islandRef = storage_ref.Child("images/island.jpg"];

// Create local filesystem URL
const char* local_url = "file:///local/images/island.jpg";

// Download to the local filesystem
Future future = islandRef.GetFile(local_url);

// Wait for Future to complete...

if (future.Error() != firebase::storage::kErrorNone) {
  // Uh-oh, an error occurred!
} else {
  // The file has been downloaded to local file URL "images/island.jpg"
}

GetFile() accetta un argomento Controller opzionale che puoi utilizzare per gestire il download. Per ulteriori informazioni, vedere Gestire i download .

Genera un URL di download

Se disponi già di un'infrastruttura di download basata sugli URL o desideri semplicemente condividere un URL, puoi ottenere l'URL di download di un file chiamando il metodo GetDownloadUrl() su un riferimento Cloud Storage.

// Create a reference to the file you want to download
StorageReference stars_ref = storage_ref.Child("images/stars.jpg");

// Fetch the download URL
firebase::Future future = stars_ref.GetDownloadUrl();

// Wait for Future to complete...

if (future.Error() != firebase::storage::kErrorNone) {
  // Uh-oh, an error occurred!
} else {
  // Get the download URL for 'images/stars.jpg'
  std::string download_url = future.Result();
}

Gestisci i download

Oltre ad avviare i download, puoi mettere in pausa, riprendere e annullare i download utilizzando i metodi Pause() , Resume() e Cancel() su Controller , che puoi facoltativamente passare ai metodi GetBytes() o GetFile() .

// Start downloading a file
Controller controller;
storage_ref.Child("images/mountains.jpg").GetFile(local_file, nullptr, &controller);

// Pause the download
controller.Pause();

// Resume the download
controller.Resume();

// Cancel the download
controller.Cancel();

Monitorare l'avanzamento del download

È possibile allegare ascoltatori ai download per monitorare l'avanzamento del download.

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").GetFile(local_file, my_listener);
}

Gestire gli errori

Esistono diversi motivi per cui potrebbero verificarsi errori durante il download, incluso il file inesistente o l'utente che non dispone dell'autorizzazione per accedere al file desiderato. Ulteriori informazioni sugli errori sono disponibili nella sezione Gestione degli errori della documentazione.

Prossimi passi

Puoi anche ottenere e aggiornare i metadati per i file archiviati in Cloud Storage.