Загрузка файлов с помощью Cloud Storage for 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 .