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 Cloud Storage plik referencyjny do pliku, który chcesz przesłać.
Możesz utworzyć odwołanie, dołączając ścieżki podrzędne do katalogu głównego zasobnika Cloud Storage, lub utworzyć odwołanie z istniejącego adresu URL gs:// lub https:// odwołującego się do obiektu w Cloud Storage.
// Create a root reference StorageReference storageRef = storage.RootReference; // Create a reference to "mountains.jpg" StorageReference mountainsRef = storageRef.Child("mountains.jpg"); // Create a reference to 'images/mountains.jpg' StorageReference mountainImagesRef = storageRef.Child("images/mountains.jpg"); // While the file names are the same, the references point to different files Assert.AreEqual(mountainsRef.Name, mountainImagesRef.Name); Assert.AreNotEqual(mountainsRef.Path, mountainImagesRef.Path);
Nie możesz przesłać danych z odwołaniem do katalogu głównego zasobnika Cloud Storage. Plik referencyjny musi wskazywać adres URL elementu podrzędnego.
Przesyłanie plików
Gdy masz już plik referencyjny, możesz przesłać pliki do Cloud Storage na 2 sposoby:
- Przesyłanie z tablicy bajtów w pamięci
- Przesyłanie ze ścieżki pliku reprezentującej plik na urządzeniu
Przesyłanie danych z pamięci
Metoda PutBytesAsync() to najprostszy sposób przesyłania pliku do Cloud Storage. Metoda PutBytesAsync() przyjmuje byte[] i zwraca System.Task<Firebase.Storage.StorageMetadata>, który po zakończeniu zadania będzie zawierać informacje o pliku. Możesz też użyć IProgress<UploadState> (zwykle StorageProgress<UploadState>), aby monitorować stan przesyłania.
// Data in memory var customBytes = new byte[] { /*...*/ }; // Create a reference to the file you want to upload StorageReference riversRef = storageRef.Child("images/rivers.jpg"); // Upload the file to the path "images/rivers.jpg" riversRef.PutBytesAsync(customBytes) .ContinueWith((Task<StorageMetadata> task) => { if (task.IsFaulted || task.IsCanceled) { Debug.Log(task.Exception.ToString()); // Uh-oh, an error occurred! } else { // Metadata contains file metadata such as size, content-type, and md5hash. StorageMetadata metadata = task.Result; string md5Hash = metadata.Md5Hash; Debug.Log("Finished uploading..."); Debug.Log("md5 hash = " + md5Hash); } });
Przesyłanie z pliku lokalnego
Możesz przesyłać pliki lokalne na urządzenia, np. zdjęcia i filmy z aparatu, za pomocą metody PutFileAsync(). Funkcja PutFileAsync() przyjmuje parametr string reprezentujący ścieżkę do pliku i zwraca obiekt System.Task<Firebase.Storage.StorageMetadata>, który po zakończeniu zadania będzie zawierał informacje o pliku. Możesz też użyć IProgress<UploadState> (zwykle StorageProgress<UploadState>), aby monitorować stan przesyłania.
// File located on disk string localFile = "..."; // Create a reference to the file you want to upload StorageReference riversRef = storageRef.Child("images/rivers.jpg"); // Upload the file to the path "images/rivers.jpg" riversRef.PutFileAsync(localFile) .ContinueWith((Task<StorageMetadata> task) => { if (task.IsFaulted || task.IsCanceled) { Debug.Log(task.Exception.ToString()); // Uh-oh, an error occurred! } else { // Metadata contains file metadata such as size, content-type, and download URL. StorageMetadata metadata = task.Result; string md5Hash = metadata.Md5Hash; Debug.Log("Finished uploading..."); Debug.Log("md5 hash = " + md5Hash); } });
Jeśli chcesz aktywnie monitorować przesyłanie, możesz użyć klasy StorageProgress lub własnej klasy, która implementuje IProgress<UploadState>, z metodami PutFileAsync() lub PutBytesAsync().
Więcej informacji znajdziesz w artykule Zarządzanie przesłanymi plikami.
Dodaj metadane 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 ContentType (powszechnie nazywane typem MIME). Metoda PutFileAsync() automatycznie wnioskuje typ treści na podstawie rozszerzenia nazwy pliku, ale możesz zastąpić automatycznie wykryty typ, określając ContentType w metadanych. Jeśli nie podasz wartości ContentType, a Cloud Storage nie może wywnioskować wartości domyślnej z rozszerzenia pliku, Cloud Storage używa application/octet-stream. Więcej informacji o metadanych plików znajdziesz w sekcji Używanie metadanych plików.
// Create storage reference StorageReference mountainsRef = storageRef.Child("images/mountains.jpg"); byte[] customBytes = new byte[] { /*...*/ }; string localFile = "..."; // Create file metadata including the content type var newMetadata = new MetadataChange(); newMetadata.ContentType = "image/jpeg"; // Upload data and metadata mountainsRef.PutBytesAsync(customBytes, newMetadata, null, CancellationToken.None); // .ContinueWithOnMainThread(... // Upload file and metadata mountainsRef.PutFileAsync(localFile, newMetadata, null, CancellationToken.None); // .ContinueWithOnMainThread(...
Monitorowanie postępu przesyłania
Możesz dołączyć detektory do przesyłanych plików, aby monitorować postęp przesyłania. Detektor jest zgodny ze standardowym interfejsem System.IProgress<T>. Możesz użyć instancji klasy StorageProgress, aby podać własną funkcję Action<T> jako wywołanie zwrotne dla znaczników postępu.
// Start uploading a file var task = storageRef.Child("images/mountains.jpg") .PutFileAsync(localFile, null, new StorageProgress<UploadState>(state => { // called periodically during the upload Debug.Log(String.Format("Progress: {0} of {1} bytes transferred.", state.BytesTransferred, state.TotalByteCount)); }), CancellationToken.None, null); task.ContinueWithOnMainThread(resultTask => { if (!resultTask.IsFaulted && !resultTask.IsCanceled) { Debug.Log("Upload finished."); } });
Obsługa błędów
Błędy podczas przesyłania mogą wystąpić z różnych powodów, np. gdy plik lokalny nie istnieje lub użytkownik nie ma uprawnień do przesłania danego pliku. Więcej informacji o błędach znajdziesz w sekcji Obsługa błędów w dokumentacji.
Następne kroki
Teraz, gdy pliki zostały przesłane, dowiedzmy się, jak je pobrać z usługi Cloud Storage.