Как загружать файлы с помощью Cloud Storage для Unity

Cloud Storage for Firebase позволяет быстро и легко загружать файлы в сегмент Cloud Storage, предоставленный и управляемый Firebase.

Создание ссылки

Чтобы загрузить файл, сначала создайте ссылку Cloud Storage на него.

Вы можете создать ссылку, добавив дочерние пути к корневому каталогу корзины Cloud Storage, или создать ссылку из существующего URL gs:// или https://, указывающего на объект в 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);

Нельзя загружать данные со ссылкой на корневой каталог сегмента Cloud Storage. Ссылка должна вести на дочерний URL.

Загрузка файлов

После того как вы создадите образец, вы сможете загрузить файлы в Cloud Storage двумя способами:

  1. Загрузка из массива байтов в памяти
  2. Загрузка из пути к файлу на устройстве

Загрузка данных из памяти

Метод PutBytesAsync() – самый простой способ загрузить файл в Cloud Storage. Функция PutBytesAsync() принимает массив байтов и возвращает объект System.Task<Firebase.Storage.StorageMetadata>, который будет содержать информацию о файле после завершения задачи. Вы можете использовать IProgress<UploadState> (обычно StorageProgress<UploadState>), чтобы отслеживать статус загрузки.

// 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);
        }
    });

Загрузка из локального файла

Вы можете загружать локальные файлы на устройствах, например фотографии и видео с камеры, с помощью метода PutFileAsync(). PutFileAsync() принимает string, представляющий путь к файлу, и возвращает System.Task<Firebase.Storage.StorageMetadata>, который будет содержать информацию о файле после завершения задачи. Вы можете использовать IProgress<UploadState> (обычно StorageProgress<UploadState>), чтобы отслеживать статус загрузки.

// 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);
        }
    });

Если вы хотите отслеживать загрузку, используйте класс StorageProgress или собственный класс, реализующий IProgress<UploadState>, с методами PutFileAsync() или PutBytesAsync(). Подробнее о том, как управлять загрузками…

Как добавить метаданные файла

При загрузке файлов можно также добавлять метаданные. Эти метаданные содержат типичные свойства файлов, такие как Name, Size и ContentType (обычно называемые MIME-типом). Метод PutFileAsync() автоматически определяет тип контента по расширению файла, но вы можете переопределить его, указав ContentType в метаданных. Если вы не укажете значение ContentType и Cloud Storage не сможет определить значение по умолчанию на основе расширения файла, Cloud Storage будет использовать значение application/octet-stream. Подробнее о метаданных файлов…

// 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(...

Как отслеживать ход загрузки

Вы можете прикрепить к загрузкам слушателей, чтобы отслеживать их прогресс. Прослушиватель соответствует стандартному интерфейсу System.IProgress<T>. Вы можете использовать экземпляр класса StorageProgress, чтобы предоставить свой собственный Action<T> в качестве обратного вызова для тиков прогресса.

// 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.");
    }
});

Обработка ошибок

При загрузке могут возникать ошибки по разным причинам, например из-за того, что локальный файл не существует или у пользователя нет разрешения на загрузку нужного файла. Дополнительную информацию об ошибках можно найти в разделе Обработка ошибок документации.

Дальнейшие действия

Теперь, когда вы загрузили файлы, давайте узнаем, как скачать их из Cloud Storage.