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, najpierw utwórz odwołanie Cloud Storage do pliku, który chcesz pobrać.
Możesz utworzyć odwołanie, dodając ścieżki podrzędne do katalogu Cloud Storage. Możesz też utworzyć odwołanie z dotychczasowego 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
Gdy masz już plik referencyjny, możesz pobrać pliki z usługi Cloud Storage na 3 sposoby:
- Pobierz do bufora w pamięci
- Pobieranie na określoną ścieżkę na urządzeniu
- Generowanie adresu URL z ciągiem znaków reprezentującego plik online
Pobieranie do pamięci
Pobierz plik do bufora bajtów w pamięci, używając metody GetBytes()
. To najprostszy sposób na szybkie pobranie pliku, który musi jednak 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<size_t> future = island_ref.GetBytes(byte_buffer, kMaxAllowedSize);
W momencie wysłania żądania musimy poczekać, aż Future zakończy działanie, aby móc odczytać plik. Gry zwykle działają w pętli i nie są tak zależne od wywołań zwrotnych jak inne aplikacje, dlatego zwykle sprawdzasz, czy proces został ukończony.
// 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<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. Więcej informacji znajdziesz w artykule Zarządzanie pobranymi plikami.
Generowanie adresu URL do pobrania
Jeśli masz już infrastrukturę pobierania opartą na adresach URL lub chcesz po prostu udostępnić adres URL, możesz uzyskać adres URL do pobrania pliku, wywołując metodę GetDownloadUrl()
w odwołaniu 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()
i Cancel()
w 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
Możesz dołączać do pobrań odbiorców, 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ępować z różnych powodów, m.in. dlatego, że plik nie istnieje lub użytkownik nie ma do niego dostępu. 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 w przypadku plików przechowywanych w Cloud Storage.