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

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

Tworzenie referencji

Aby pobrać plik, najpierw utwórz odniesienie do Cloud Storage do pliku, który chcesz pobrać.

Możesz utworzyć odwołanie, dodając ścieżki podrzędne do katalogu głównego zasobnika Cloud Storage. Możesz też utworzyć odwołanie z istniejącego adresu URL gs:// lub https:// odwołującego 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 pliku

Po utworzeniu pliku referencyjnego możesz pobrać pliki z Cloud Storage na 3 sposoby:

  1. Pobierz do bufora w pamięci
  2. Pobierz plik do określonej ścieżki na urządzeniu
  3. Generowanie adresu URL z ciągiem znaków reprezentującego plik online

Pobierz we wspomnieniu

Pobierz plik do bufora bajtów w pamięci za pomocą metody GetBytes(). To najprostszy sposób na szybkie pobranie pliku, który jednak musi wczytać do pamięci całą jego zawartość. Jeśli zażądasz pliku większego niż dostępna pamięć, aplikacja ulegnie awarii. Aby uniknąć problemów z pamięcią, ustaw maksymalny rozmiar na taki, o którym wiesz, że Twoja aplikacja obsługuje, 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 future = island_ref.GetBytes(byte_buffer, kMaxAllowedSize);

Otrzymaliśmy już w ten sposób wniosek, ale zanim będzie można odczytać plik, trzeba poczekać na zakończenie prac w przyszłości. Gry zwykle działają w pętli i są mniej wywoływane niż inne aplikacje, dlatego sondowanie jest zwykle przeprowadzane w celu ukończenia.

// 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żywaj, jeśli użytkownicy chcą mieć dostęp do pliku offline lub udostępnić 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 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żywać do zarządzania pobieraniem. Więcej informacji znajdziesz w artykule Zarządzanie pobranymi plikami.

Generowanie adresu URL pobierania

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

Zarządzanie pobranymi plikami

Oprócz rozpoczynania pobierania możesz wstrzymywać, wznawiać i anulować pobieranie za pomocą metod Pause(), Resume() i Cancel() na Controller, które opcjonalnie możesz 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

Aby monitorować postęp pobierania, możesz dołączyć do pobranych detektorów.

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 mogą wynikać z różnych powodów, np. gdy plik nie istnieje lub użytkownik nie ma uprawnień dostępu do niego. Więcej informacji o błędach znajdziesz w sekcji Obsługa błędów w tej dokumentacji.

Następne kroki

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