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 Storage referencję do pliku, który chcesz pobrać.
Referencję możesz utworzyć, dodając ścieżki podrzędne do katalogu głównego zasobnika
Cloud Storage lub na podstawie 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 plików
Gdy masz referencję, możesz pobierać pliki z Cloud Storage na 3 sposoby:
- Pobierz do bufora w pamięci
- Pobierz do określonej ścieżki na urządzeniu
- Wygeneruj adres URL w postaci ciągu znaków reprezentujący plik online
Pobieranie do pamięci
Pobierz plik do bufora bajtów w pamięci za pomocą metody GetBytes(). Jest to najprostszy sposób na szybkie pobranie pliku, ale wymaga wczytania całej zawartości pliku do pamięci. Jeśli poprosisz o plik większy niż dostępna pamięć aplikacji, aplikacja ulegnie awarii. Aby uniknąć problemów z pamięcią, ustaw maksymalny rozmiar na wartość, którą Twoja aplikacja może obsłużyć, 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ć na zakończenie przyszłości, zanim będziemy mogli odczytać plik. Ponieważ gry zwykle działają w pętli i są mniej zależne od wywołań zwrotnych niż inne aplikacje, zwykle będziesz sprawdzać, czy operacja się zakończyła.
// 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 metody, jeśli użytkownicy mają 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" }
Metoda GetFile() przyjmuje opcjonalny argument Controller, którego możesz użyć do zarządzania pobieraniem. Więcej informacji znajdziesz w sekcji 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 wstrzymywać, wznawiać i anulować pobieranie za pomocą metod Pause(), Resume() i Cancel() w Controller, które 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ć odbiorniki do pobierania, 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 podczas pobierania mogą wystąpić z wielu powodów, m.in. z powodu braku pliku lub braku uprawnień użytkownika do dostępu do żądanego 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.