Cloud Storage for Firebase umożliwia szybkie i łatwe przesyłanie plików do zasobnika Cloud Storage udostępnianego i zarządzanego przez Firebase.
Tworzenie referencji
Aby przesłać plik, najpierw utwórz referencję Cloud Storage do lokalizacji w Cloud Storage, do której chcesz przesłać plik.
Referencję możesz utworzyć, dołączając ścieżki podrzędne do katalogu głównego zasobnika Cloud Storage:
// Create a root reference StorageReference storage_ref = storage->GetReference(); // Create a reference to "mountains.jpg" StorageReference mountains_ref = storage_ref.Child("mountains.jpg"); // Create a reference to 'images/mountains.jpg' StorageReference mountain_images_ref = storage_ref.Child("images/mountains.jpg"); // While the file names are the same, the references point to different files mountains_ref.name() == mountain_images_ref.name(); // true mountains_ref.full_path() == mountain_images_ref.full_path(); // false
Nie możesz przesyłać danych za pomocą referencji do katalogu głównego swojego Cloud Storage zasobnika. Referencja musi wskazywać adres URL podrzędny.
Przesyłanie plików
Gdy masz już referencję, możesz przesłać pliki do Cloud Storage na 2 sposoby:
- Przesyłanie z bufora bajtów w pamięci
- Przesyłanie ze ścieżki pliku reprezentującej plik na urządzeniu
Przesyłanie z danych w pamięci
Metoda PutData() to najprostszy sposób przesyłania pliku do
Cloud Storage. PutData() przyjmuje bufor bajtów i zwraca
Future<Metadata>, który po zakończeniu działania będzie zawierać informacje o pliku. Do zarządzania przesyłaniem i monitorowania jego stanu możesz użyć Controller.
// Data in memory const size_t kByteBufferSize = ... uint8_t byte_buffer[kByteBufferSize] = { ... }; // Create a reference to the file you want to upload StorageReference rivers_ref = storage_ref.Child("images/rivers.jpg"); // Upload the file to the path "images/rivers.jpg" Futurefuture = rivers_ref.PutBytes(byte_buffer, kByteBufferSize);
W momencie wysłania żądania musimy poczekać na zakończenie działania Future, zanim plik zostanie przesłany. Gry zwykle działają w pętli i są mniej zależne od wywołań zwrotnych niż inne aplikacje, dlatego zwykle sprawdzasz, czy działanie zostało zakończone.
if (future.status() != firebase::kFutureStatusPending) { if (future.status() != firebase::kFutureStatusComplete) { LogMessage("ERROR: GetData() returned an invalid future."); // Handle the error... } else if (future.Error() != firebase::storage::kErrorNone) { LogMessage("ERROR: GetData() returned error %d: %s", future.Error(), future.error_message()); // Handle the error... } } else { // Metadata contains file metadata such as size, content-type, and download URL. Metadata* metadata = future.Result(); std::string download_url = metadata->download_url(); } }
Przesyłanie z pliku lokalnego
Za pomocą metody PutFile() możesz przesyłać pliki lokalne na urządzeniach, np. zdjęcia i filmy z aparatu. PutFile() przyjmuje std::string
reprezentujący ścieżkę do pliku i zwraca
Future<Metadata>, który po zakończeniu działania będzie zawierać
informacje o pliku. Do zarządzania przesyłaniem i monitorowania jego stanu możesz użyć Controller.
// File located on disk std::string local_file = ... // Create a reference to the file you want to upload StorageReference rivers_ref = storage_ref.Child("images/rivers.jpg"); // Upload the file to the path "images/rivers.jpg" Futurefuture = rivers_ref.PutFile(localFile); // Wait for Future to complete... if (future.Error() != firebase::storage::kErrorNone) { // Uh-oh, an error occurred! } else { // Metadata contains file metadata such as size, content-type, and download URL. Metadata* metadata = future.Result(); std::string download_url = metadata->download_url(); }
Jeśli chcesz aktywnie zarządzać przesyłaniem, możesz przekazać Controller do metod PutFile() lub PutBytes(). Umożliwi Ci to obserwowanie za pomocą kontrolera trwającej operacji przesyłania. Więcej informacji znajdziesz w sekcji Zarządzanie przesyłaniem.
Dodawanie metadanych pliku
Podczas przesyłania plików możesz też dołączyć metadane. Te metadane zawierają typowe właściwości metadanych pliku, takie jak name, size i content_type (zwykle nazywany typem MIME). Metoda PutFile() automatycznie wywnioskuje typ treści z rozszerzenia nazwy pliku, ale możesz zastąpić automatycznie wykryty typ, określając content_type w metadanych. Jeśli nie podasz content_type, a Cloud Storage nie będzie mógł wywnioskować domyślnego typu z
rozszerzenia pliku, Cloud Storage użyje application/octet-stream. Więcej informacji o metadanych pliku znajdziesz w sekcji
Używanie metadanych pliku.
// Create storage reference StorageReference mountains_ref = storage_ref.Child("images/mountains.jpg"); // Create file metadata including the content type StorageMetadata metadata; metadata.set_content_type("image/jpeg"); // Upload data and metadata mountains_ref.PutBytes(data, metadata); // Upload file and metadata mountains_ref.PutFile(local_file, metadata);
Zarządzanie przesyłaniem
Oprócz rozpoczynania przesyłania możesz je wstrzymywać, wznawiać i anulować za pomocą metod Pause(), Resume() i Cancel() w Controller, które możesz opcjonalnie przekazać do metod PutBytes() lub PutFile().
// Start uploading a file firebase::storage::Controller controller; storage_ref.Child("images/mountains.jpg").PutFile(local_file, nullptr, &controller); // Pause the upload controller.Pause(); // Resume the upload controller.Resume(); // Cancel the upload controller.Cancel();
Monitorowanie postępu przesyłania
Aby monitorować postęp przesyłania, możesz dołączyć do niego odbiorniki.
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").PutFile(local_file, my_listener); }
Obsługa błędów
Błędy podczas przesyłania mogą wystąpić z wielu powodów, np. z powodu braku pliku lokalnego lub braku uprawnień użytkownika do przesłania wybranego pliku. Więcej informacji o błędach znajdziesz w sekcji Obsługa błędów w dokumentacji.
Następne kroki
Teraz, gdy już wiesz, jak przesyłać pliki, dowiedz się, jak je pobierać z Cloud Storage.