Pobieranie plików za pomocą Cloud Storage dla C++

Cloud Storage for Firebase umożliwia szybkie i łatwe pobieranie plików z Cloud Storage zasobnika udostępnianego i zarządzanego przez Firebase.

Tworzenie referencji

Aby pobrać plik, najpierw utwórz Cloud Storageodwołanie do pliku, który chcesz pobrać.

Możesz utworzyć odwołanie, dołączając ścieżki podrzędne do katalogu głównego Cloud Storage zasobnika, lub utworzyć odwołanie z istniejącego adresu URL gs:// lub https://, który odwołuje się do obiektu w 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");

Pobieranie plików

Po uzyskaniu dostępu do materiałów referencyjnych możesz pobrać pliki z Cloud Storage na 3 sposoby:

  1. Pobieranie do bufora w pamięci
  2. Pobieranie do określonej ścieżki na urządzeniu
  3. Wygeneruj ciąg znaków URL reprezentujący plik online.

Pobieranie w pamięci

Pobierz plik do bufora bajtowego w pamięci za pomocą metody GetBytes(). Jest to najprostszy sposób szybkiego pobierania pliku, ale wymaga załadowania całej zawartości pliku do pamięci. Jeśli zażądasz pliku większego niż dostępna pamięć aplikacji, aplikacja ulegnie awarii. Aby zapobiec problemom z pamięcią, ustaw maksymalny rozmiar na wartość, z którą Twoja aplikacja sobie poradzi, lub użyj innej metody pobierania.

// 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);

W tym momencie żądanie zostało wysłane, ale musimy poczekać, aż obiekt Future zostanie ukończony, zanim będziemy mogli odczytać plik. Gry zwykle działają w pętli i są mniej oparte na wywołaniach zwrotnych niż inne aplikacje, dlatego zwykle sprawdzasz, czy zostały ukończone.

// 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"
  }
}

Pobieranie do pliku lokalnego

Metoda GetFile() pobiera plik bezpośrednio na urządzenie lokalne. Użyj tej opcji, jeśli użytkownicy chcą mieć dostęp do pliku w trybie offline lub udostępniać go w innej aplikacji.

// 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"
}

Funkcja GetFile() przyjmuje opcjonalny argument Controller, którego możesz użyć do zarządzania pobieraniem. Więcej informacji znajdziesz w artykule Zarządzanie pobranymi plikami.

Generowanie adresu URL pobierania

Jeśli masz już infrastrukturę pobierania opartą na adresach URL lub po prostu chcesz udostępnić adres URL, możesz uzyskać adres URL pobierania pliku, wywołując metodę GetDownloadUrl() na referencji 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();
}

Zarządzanie pobranymi plikami

Oprócz rozpoczynania pobierania możesz je wstrzymywać, wznawiać i anulować za pomocą metod Pause(), Resume()Cancel() na obiekcie Controller, który możesz opcjonalnie przekazać do metod GetBytes() lub 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();

Monitorowanie postępu pobierania

Możesz dołączyć do pobierania odbiorniki, aby monitorować postęp pobierania.

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);
}

Obsługa błędów

Błędy pobierania mogą wystąpić z różnych powodów, np. z powodu braku pliku lub braku uprawnień użytkownika do uzyskania dostępu do wybranego pliku. Więcej informacji o błędach znajdziesz w sekcji Obsługa błędów w dokumentacji.

Następne kroki

Możesz też pobierać i aktualizować metadane plików przechowywanych w Cloud Storage.