Przesyłanie plików za pomocą Cloud Storage dla Unity

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 pliku, który chcesz przesłać.

Możesz utworzyć odwołanie, dodając ścieżki podrzędne do katalogu głównego zasobnika Cloud Storage. Możesz też utworzyć odwołanie z dotychczasowego adresu URL gs:// lub https://, który odwołuje 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. 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:

  1. Przesyłanie z tablicy bajtów w pamięci
  2. Przesyłanie z ścieżki pliku na urządzeniu

Przesyłanie danych z pamięci

Metoda PutBytesAsync() jest najprostszym sposobem przesyłania plików do usługi Cloud Storage. PutBytesAsync() przyjmuje byte[] 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> (zazwyczaj 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, takie jak zdjęcia i filmy z aparatu. PutFileAsync() przyjmuje string reprezentujący ścieżkę do pliku i zwraca System.Task<Firebase.Storage.StorageMetadata>, który zawiera informacje o pliku po zakończeniu zadania. Opcjonalnie możesz użyć IProgress<UploadState> (zazwyczaj 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 implementującej interfejs IProgress<UploadState> za pomocą metod PutFileAsync() lub PutBytesAsync(). 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 ContentType (zwykle określane jako typ MIME). Metoda PutFileAsync() automatycznie wywnioskuje typ treści na podstawie rozszerzenia nazwy pliku, ale możesz zastąpić automatycznie wykryty typ, podając ContentType w metadanych. Jeśli nie podasz wartości ContentType, 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 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ć 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 podać własną funkcję Action<T> jako funkcję wywołania zwrotnego dla sygnałó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, 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ćCloud Storage.