Как загружать файлы с помощью 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() принимает byte[] и возвращает 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.