Cloud Storage for Firebase umożliwia szybkie i łatwe przesyłanie plików do zasobnika Cloud Storage udostępnionego i zarządzanego przez Firebase.
Tworzenie referencji
Aby przesłać plik, najpierw utwórz odwołanie Cloud Storage do lokalizacji w Cloud Storage, do której chcesz przesłać plik.
Możesz utworzyć odwołanie, dołączając ścieżki podrzędne do katalogu głównego 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 z odniesieniem do katalogu głównego zasobnika Cloud Storage. Odwoływanie musi wskazywać adres URL podrzędny.
Prześlij pliki
Po uzyskaniu odwołania możesz przesłać pliki do usługi Cloud Storage na 2 sposoby:
- Przesyłanie z bufora bajtów w pamięci
- Przesyłanie z ścieżki pliku na urządzeniu
Przesyłanie danych z pamięci
Metoda PutData()
jest najprostszym sposobem przesyłania plików do usługi Cloud Storage. PutData()
przyjmuje bufor bajtów i zwraca Future<Metadata>
, który zawiera informacje o pliku po zakończeniu działania Future. Za pomocą Controller
możesz zarządzać przesyłaniem i sprawdzać jego stan.
// 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 tym momencie żądanie zostało już wysłane, ale musimy poczekać, aż Future zakończy działanie, zanim plik zostanie przesłany. Gry zwykle działają w pętli i nie są tak zależne od wywołania zwrotnego jak inne aplikacje, dlatego zwykle sprawdzasz, czy proces został ukończony.
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, takie jak zdjęcia i filmy z aparatu. PutFile()
przyjmuje std::string
reprezentujący ścieżkę do pliku i zwraca Future<Metadata>
, który będzie zawierać informacje o pliku po zakończeniu działania funkcji Future. Za pomocą pliku Controller
możesz zarządzać przesyłaniem i monitorować jego stan.
// 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łanymi danymi, możesz podać Controller
do metod PutFile()
lub PutBytes()
. Dzięki temu możesz używać kontrolera do obserwowania 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 określane jako typ MIME). Metoda PutFile()
automatycznie wywnioskuje typ treści na podstawie rozszerzenia nazwy pliku, ale możesz zastąpić automatycznie wykryty typ, podając content_type
w metadanych. Jeśli nie podasz wartości content_type
, a Cloud Storage nie będzie mogło wywnioskować domyślnej wartości na podstawie rozszerzenia pliku, funkcja Cloud Storage użyje wartości application/octet-stream
. Więcej informacji o metadanych plików znajdziesz w sekcji Używanie metadanych plików.
// 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ądzaj przesyłaniem
Oprócz inicjowania przesyłania możesz wstrzymywać, wznawiać i anulować przesyłanie za pomocą metod Pause()
, Resume()
i Cancel()
w funkcji Controller
. Metody te 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
Możesz dołączyć słuchaczy do przesyłanych plików, aby monitorować postęp przesyłania.
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 różnych powodów, na przykład dlatego, że plik lokalny nie istnieje lub użytkownik nie ma uprawnień do przesłania odpowiedniego pliku. Więcej informacji o błędach znajdziesz w sekcji Przetwarzanie błędów w dokumentacji.
Następne kroki
Ponieważ pliki zostały już przesłane, dowiedz się, jak je pobrać z Cloud Storage.