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

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

Tworzenie referencji

Aby pobrać plik, utwórz referencję Cloud Storage w pliku, który chcesz pobrać.

Odwołanie możesz utworzyć, dołączając ścieżki podrzędne do katalogu głównego Cloud Storage, ale możesz utworzyć plik referencyjny z istniejącego gs:// lub https:// URL odwołujący 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

Gdy będziesz mieć już plik referencyjny, możesz pobierać pliki z usługi 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(). Ten to najprostszy sposób na szybkie pobranie pliku, który wymaga jednak wczytania całej zawartości pliku do pamięci. Jeśli zażądasz pliku większego niż plik aplikacji dostępnej pamięci, aplikacja ulegnie awarii. Aby zabezpieczyć się przed problemami z pamięcią, skonfiguruj ustaw maksymalny rozmiar na coś, o czym wiesz, że aplikacja jest w stanie obsłużyć, lub używaj 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);

Otrzymaliśmy już wprawdzie wniosek, ale musimy poczekać na zanim plik zostanie odczytany. Gry zwykle uruchamiają się w pętli. są mniej oparte na wywołaniach zwrotnych niż inne aplikacje, zwykle do końca.

// 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ę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<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, za pomocą którego można zarządzać pobieraniem. Zobacz Zarządzanie pobranymi plikami .

Generowanie adresu URL do pobrania

Jeśli Twoja infrastruktura do pobierania jest już oparta na adresach URL lub chcesz adresu URL do udostępnienia, możesz uzyskać adres URL pobierania pliku, wywołując metodę Metoda GetDownloadUrl() w odwołaniach 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 pobraniami

Oprócz uruchamiania pobierania możesz je wstrzymywać, wznawiać i anulować za pomocą metod Pause(), Resume()Cancel()Controller, które możesz opcjonalnie przekazać metodom 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 przesyłania, możesz dołączyć do pobranych plików detektory pobierz.

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ą występować przy pobieraniu z kilku powodów. Oto niektóre z nich: jeśli plik nie istnieje lub użytkownik nie ma uprawnień dostępu do żądanego pliku. Więcej informacji o błędach znajdziesz w sekcji Przetwarzanie błędów w dokumentacji.

Następne kroki

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