Загрузка файлов с помощью Cloud Storage for Unity

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

Создать ссылку

Чтобы загрузить файл, сначала создайте ссылку на облачное хранилище для файла, который вы хотите загрузить.

Вы можете создать ссылку, добавив дочерние пути к корню сегмента Cloud Storage, либо создать ссылку на основе существующего URL-адреса gs:// или https:// , ссылающегося на объект в Cloud Storage.

// Create a reference with an initial file path and name
StorageReference pathReference =
    storage.GetReference("images/stars.jpg");

// Create a reference from a Google Cloud Storage URI
StorageReference gsReference =
    storage.GetReferenceFromUrl("gs://bucket/images/stars.jpg");

// Create a reference from an HTTPS URL
// Note that in the URL, characters are URL escaped!
StorageReference httpsReference =
    storage.GetReferenceFromUrl("https://firebasestorage.googleapis.com/b/bucket/o/images%20stars.jpg");

Скачать файлы

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

  1. Загрузить с URL-адреса
  2. Загрузка в массив байтов
  3. Скачать с потоком
  4. Загрузить в локальный файл

Метод, который вы будете использовать для получения файлов, будет зависеть от того, как вы хотите использовать данные в своей игре.

Загрузить с URL-адреса

Если вы хотите использовать URL-адрес с WWW Unity или UnityWebRequest вы можете получить URL-адрес загрузки файла, вызвав GetDownloadUrlAsync() .

// Fetch the download URL
reference.GetDownloadUrlAsync().ContinueWithOnMainThread(task => {
    if (!task.IsFaulted && !task.IsCanceled) {
        Debug.Log("Download URL: " + task.Result);
        // ... now download the file via WWW or UnityWebRequest.
    }
});

Загрузка в массив байтов

Вы можете загрузить файл в байтовый буфер в памяти, используя метод GetBytesAsync() . Этот метод загрузит все содержимое вашего файла в память. Если вы запросите файл, размер которого превышает доступную память вашего приложения, ваше приложение выйдет из строя. Чтобы защититься от проблем с памятью, обязательно установите максимальный размер, который, как вы знаете, может выдержать ваше приложение, или используйте другой метод загрузки.

// Download in memory with a maximum allowed size of 1MB (1 * 1024 * 1024 bytes)
const long maxAllowedSize = 1 * 1024 * 1024;
reference.GetBytesAsync(maxAllowedSize).ContinueWithOnMainThread(task => {
    if (task.IsFaulted || task.IsCanceled) {
        Debug.LogException(task.Exception);
        // Uh-oh, an error occurred!
    }
    else {
        byte[] fileContents = task.Result;
        Debug.Log("Finished downloading!");
    }
});

Загрузка через поток

Загрузка файла с помощью потока позволяет вам обрабатывать данные по мере их загрузки. Это дает вам максимальную гибкость при загрузке. Вызовите GetStreamAsync() и передайте свой собственный потоковый процессор в качестве первого аргумента. Этот делегат будет вызван в фоновом потоке с потоком, который позволяет вам выполнять операции или вычисления с интенсивными задержками, такие как сохранение содержимого на диск.

// Download via a Stream
reference.GetStreamAsync(stream => {
    // Do something with the stream here.
    //
    // This code runs on a background thread which reduces the impact
    // to your framerate.
    //
    // If you want to do something on the main thread, you can do that in the
    // progress eventhandler (second argument) or ContinueWith to execute it
    // at task completion.
}, null, CancellationToken.None);

GetStreamAsync() принимает необязательные аргументы после потокового процессора, которые позволяют отменить операцию или получить уведомление о ходе выполнения.

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

Метод GetFileAsync() загружает файл непосредственно на локальное устройство. Используйте это, если ваши пользователи хотят иметь доступ к файлу в автономном режиме или поделиться файлом в другом приложении.

// Create local filesystem URL
string localUrl = "file:///local/images/island.jpg";

// Download to the local filesystem
reference.GetFileAsync(localUrl).ContinueWithOnMainThread(task => {
    if (!task.IsFaulted && !task.IsCanceled) {
        Debug.Log("File downloaded.");
    }
});

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

// Create local filesystem URL
string localUrl = "file:///local/images/island.jpg";

// Start downloading a file
Task task = reference.GetFileAsync(localFile,
    new StorageProgress<DownloadState>(state => {
        // called periodically during the download
        Debug.Log(String.Format(
            "Progress: {0} of {1} bytes transferred.",
            state.BytesTransferred,
            state.TotalByteCount
        ));
    }), CancellationToken.None);

task.ContinueWithOnMainThread(resultTask => {
    if (!resultTask.IsFaulted && !resultTask.IsCanceled) {
        Debug.Log("Download finished.");
    }
});

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

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

Следующие шаги

Вы также можете получать и обновлять метаданные для файлов, хранящихся в облачном хранилище.