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 referencję do pliku, który chcesz przesłać.
Referencję możesz utworzyć, dołączając ścieżki podrzędne do katalogu głównego zasobnika
Cloud Storage, lub utworzyć ją na podstawie 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 przesyłać danych z referencją do katalogu głównego zasobnika Cloud Storage. 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 tablicy 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 PutBytesAsync() to najprostszy sposób przesyłania pliku do
Cloud Storage. PutBytesAsync() przyjmuje tablicę bajtów
i zwraca System.Task<Firebase.Storage.StorageMetadata>, która po zakończeniu zadania będzie
zawierać informacje o pliku. Opcjonalnie możesz
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
Za pomocą metody PutFileAsync() możesz przesyłać pliki lokalne na urządzeniach, np. zdjęcia i filmy z aparatu. PutFileAsync() przyjmuje string
reprezentujący ścieżkę do pliku i zwraca
System.Task<Firebase.Storage.StorageMetadata>, która po zakończeniu zadania będzie zawierać
informacje o pliku. Opcjonalnie możesz
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ć StorageProgress
klasy lub własnej klasy, która implementuje IProgress<UploadState>, z metodami
PutFileAsync() lub PutBytesAsync().
Więcej informacji znajdziesz w artykule 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 ContentType (zwykle nazywany typem MIME). Metoda PutFileAsync() automatycznie określa 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 ContentType, a Cloud Storage nie będzie w stanie określić domyślnego typu na podstawie rozbrzmienia pliku, Cloud Storage użyje application/octet-stream. Więcej informacji o metadanych pliku znajdziesz w sekcji
Korzystanie z metadanych pliku.
// 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
Aby monitorować postęp przesyłania, możesz dołączyć do niego odbiorniki. Odbiornik jest zgodny ze standardowym System.IProgress<T>
interfejsem. Możesz użyć instancji klasy StorageProgress, aby podać
własną 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 wielu powodów, m.in. 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.