Przesyłaj pliki za pomocą Cloud Storage for Unity

Cloud Storage dla Firebase umożliwia szybkie i łatwe przesyłanie plików do zasobnika Cloud Storage udostępnianego i zarządzanego przez Firebase.

Utwórz odniesienie

Aby przesłać plik, najpierw utwórz odniesienie do Cloud Storage dla pliku, który chcesz przesłać.

Możesz utworzyć odniesienie, dołączając ścieżki podrzędne do katalogu głównego zasobnika Cloud Storage lub możesz utworzyć odniesienie z istniejącego adresu URL gs:// lub https:// odnoszą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 odniesieniem do katalogu głównego zasobnika Cloud Storage. Twoje odwołanie musi wskazywać na podrzędny adres URL.

Prześlij pliki

Po uzyskaniu referencji możesz przesyłać pliki do Cloud Storage na dwa sposoby:

  1. Prześlij z tablicy bajtów w pamięci
  2. Prześlij ze ścieżki pliku reprezentującej plik na urządzeniu

Prześlij z danych znajdujących się w pamięci

Metoda PutBytesAsync() to najprostszy sposób przesłania pliku do Cloud Storage. PutBytesAsync() pobiera bajt[] i zwraca System.Task<Firebase.Storage.StorageMetadata> , który będzie zawierał informacje o pliku po zakończeniu zadania. Opcjonalnie możesz użyć IProgress<UploadState> (zwykle StorageProgress<UploadState> ) do monitorowania stanu 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);
        }
    });

Prześlij z pliku lokalnego

Za pomocą metody PutFileAsync() możesz przesyłać pliki lokalne na urządzenia, takie jak zdjęcia i filmy z aparatu. PutFileAsync() pobiera string reprezentujący ścieżkę do pliku i zwraca System.Task<Firebase.Storage.StorageMetadata> , który będzie zawierał informacje o pliku po zakończeniu zadania. Opcjonalnie możesz użyć IProgress<UploadState> (zwykle StorageProgress<UploadState> ) do monitorowania stanu 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> za pomocą metod PutFileAsync() lub PutBytesAsync() . Aby uzyskać więcej informacji, zobacz Zarządzanie przesyłaniem .

Dodaj metadane pliku

Przesyłając pliki, możesz także dołączyć metadane. Te metadane zawierają typowe właściwości metadanych pliku, takie jak Name , Size i ContentType (powszechnie określane jako typ MIME). Metoda PutFileAsync() automatycznie wnioskuje typ zawartości na podstawie rozszerzenia nazwy pliku, ale można zastąpić typ wykryty automatycznie, określając ContentType w metadanych. Jeśli nie podasz ContentType i Cloud Storage nie będzie mógł wywnioskować wartości domyślnej z rozszerzenia pliku, Cloud Storage użyje application/octet-stream . Aby uzyskać więcej informacji na temat metadanych plików, zobacz sekcję Użyj 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(...

Monitoruj postęp przesyłania

Możesz dołączyć słuchaczy do przesyłanych plików, aby monitorować postęp przesyłania. Odbiornik korzysta ze standardowego interfejsu System.IProgress<T> . Możesz użyć instancji klasy StorageProgress , aby udostępnić 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

Istnieje wiele powodów, dla których mogą wystąpić błędy podczas przesyłania, na przykład nieistniejący plik lokalny lub brak uprawnień użytkownika do przesłania żądanego pliku. Więcej informacji na temat błędów można znaleźć w sekcji Obsługiwanie błędów w dokumentacji.

Następne kroki

Po przesłaniu plików nauczmy się, jak je pobrać z Cloud Storage.