Загрузка файлов с помощью 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.");
    }
});

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

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

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

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