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ępnianego i zarządzanego przez Firebase.

Tworzenie referencji

Aby przesłać plik, najpierw utwórz Cloud Storageodwołanie do pliku, który chcesz przesłać.

Możesz utworzyć odwołanie, dołączając ścieżki podrzędne do katalogu głównego Cloud Storage zasobnika, 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 przesyłać danych z odwołaniem do katalogu głównego zasobnika Cloud Storage. Odwołanie musi wskazywać adres URL podrzędny.

Prześlij pliki

Po uzyskaniu odniesienia możesz przesłać pliki do Cloud Storage na 2 sposoby:

  1. Przesyłanie z tablicy bajtów w pamięci
  2. 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 plików do Cloud Storage. PutBytesAsync() przyjmuje argument byte[] i zwraca System.Task<Firebase.Storage.StorageMetadata>, który 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

Możesz przesyłać lokalne pliki na urządzeniach, takie jak zdjęcia i filmy z aparatu, za pomocą metody PutFileAsync(). PutFileAsync() przyjmuje string reprezentujący ścieżkę do pliku i zwraca System.Task<Firebase.Storage.StorageMetadata>, który 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ć klasy StorageProgress 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ż uwzględnić metadane. Te metadane zawierają typowe właściwości metadanych pliku, takie jak Name, SizeContentType (zwykle określane jako typ MIME). Metoda PutFileAsync() automatycznie wnioskuje typ treści z 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 usługa Cloud Storage nie będzie mogła wywnioskować domyślnej wartości z rozszerzenia pliku, 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ć odbiorców do przesyłanych plików, aby monitorować postęp przesyłania. Obiekt nasłuchujący 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

Istnieje wiele powodów, dla których podczas przesyłania mogą wystąpić błędy, np. brak lokalnego pliku lub brak 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

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