Cloud Storage for Firebase consente di scaricare in modo rapido e semplice i file da un bucket Cloud Storage fornito e gestito da Firebase.
Creazione di un riferimento
Per scaricare un file, innanzitutto crea un riferimento Cloud Storage al file che vuoi 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");
Scarica file
Una volta ottenuto un riferimento, puoi scaricare i file da Cloud Storage in tre modi:
- Scarica in un buffer in memoria
- Scarica in un percorso specifico sul dispositivo
- Genera un URL di stringa che rappresenti il file online
Scaricare in memoria
Scarica il file in un buffer di byte in memoria utilizzando il metodo GetBytes()
. Si tratta del modo più semplice per scaricare rapidamente un file, ma deve caricarne l'intero contenuto in memoria. Se richiedi un file più grande della memoria disponibile dell'app, l'app si arresterà in modo anomalo. Per evitare problemi di memoria, assicurati di impostare la dimensione massima su un valore facilmente gestibile dalla tua app oppure 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<size_t> future = island_ref.GetBytes(byte_buffer, kMaxAllowedSize);
La richiesta è stata effettuata, ma dobbiamo attendere il completamento dell'operazione Future prima di poter leggere il file. Poiché i giochi in genere vengono eseguiti in un loop e sono meno basati su callback rispetto ad altre applicazioni, in genere esegui un 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. Utilizza questa opzione se
gli utenti vogliono avere accesso al file quando 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<size_t> 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 facoltativo Controller
che puoi utilizzare per gestire il download. Per ulteriori informazioni, consulta Gestire i download.
Generare un URL di download
Se hai già un'infrastruttura di download basata su URL o vuoi semplicemente un URL da condividere, 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<std::string> 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(); }
Gestire i download
Oltre ad avviare i download, puoi metterli in pausa, riprenderli e annullarli
utilizzando i metodi Pause()
, Resume()
e Cancel()
su
Controller
, che puoi eventualmente 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
Puoi associare gli 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, ad esempio il file non esiste o l'utente non dispone dell'autorizzazione per accedere al file desiderato. Puoi trovare ulteriori informazioni sugli errori nella sezione Gestire gli errori della documentazione.
Passaggi successivi
Puoi anche ottenere e aggiornare i metadati per i file archiviati in Cloud Storage.