Fazer upload de arquivos com o Cloud Storage para Unity

O Cloud Storage para Firebase permite fazer upload de arquivos de forma rápida e fácil para um bucket do Cloud Storage fornecido e gerenciado pelo Firebase.

Crie uma referência

Para fazer upload de um arquivo, primeiro crie uma referência do Cloud Storage para o arquivo que você deseja enviar.

Você pode criar uma referência anexando caminhos secundários à raiz do bucket do Cloud Storage ou pode criar uma referência a partir de um URL gs:// ou https:// existente que faz referência a um objeto no 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);

Não é possível fazer upload de dados com referência à raiz do bucket do Cloud Storage. Sua referência deve apontar para um URL filho.

Fazer upload de arquivos

Depois de ter uma referência, você poderá fazer upload de arquivos para o Cloud Storage de duas maneiras:

  1. Upload de uma matriz de bytes na memória
  2. Fazer upload de um caminho de arquivo que representa um arquivo no dispositivo

Upload de dados na memória

O método PutBytesAsync() é a maneira mais simples de fazer upload de um arquivo para o Cloud Storage. PutBytesAsync() pega um byte[] e retorna um System.Task<Firebase.Storage.StorageMetadata> que conterá informações sobre o arquivo quando a tarefa for concluída. Opcionalmente, você pode usar um IProgress<UploadState> (normalmente StorageProgress<UploadState> ) para monitorar o status do upload.

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

Carregar de um arquivo local

Você pode fazer upload de arquivos locais nos dispositivos, como fotos e vídeos da câmera, com o método PutFileAsync() . PutFileAsync() pega uma string que representa o caminho para o arquivo e retorna um System.Task<Firebase.Storage.StorageMetadata> que conterá informações sobre o arquivo quando a tarefa for concluída. Opcionalmente, você pode usar um IProgress<UploadState> (normalmente StorageProgress<UploadState> ) para monitorar o status do upload.

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

Se quiser monitorar ativamente seu upload, você pode usar uma classe StorageProgress ou sua própria classe que implementa IProgress<UploadState> , com os métodos PutFileAsync() ou PutBytesAsync() . Consulte Gerenciar uploads para obter mais informações.

Adicionar metadados de arquivo

Você também pode incluir metadados ao fazer upload de arquivos. Esses metadados contêm propriedades típicas de metadados de arquivo, como Name , Size e ContentType (comumente chamado de tipo MIME). O método PutFileAsync() infere automaticamente o tipo de conteúdo da extensão do nome do arquivo, mas você pode substituir o tipo detectado automaticamente especificando ContentType nos metadados. Se você não fornecer um ContentType e o Cloud Storage não puder inferir um padrão da extensão do arquivo, o Cloud Storage usará application/octet-stream . Consulte a seção Usar metadados de arquivo para obter mais informações sobre metadados de arquivo.

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

Monitore o progresso do upload

Você pode anexar ouvintes aos uploads para monitorar o progresso do upload. O ouvinte segue a interface System.IProgress<T> padrão. Você pode usar uma instância da classe StorageProgress para fornecer seu próprio Action<T> como retorno de chamada para ticks de progresso.

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

Manipulação de erros

Há vários motivos pelos quais podem ocorrer erros no upload, incluindo a inexistência do arquivo local ou o usuário não ter permissão para fazer upload do arquivo desejado. Você pode encontrar mais informações sobre erros na seção Tratar erros dos documentos.

Próximos passos

Agora que você fez upload dos arquivos, vamos aprender como baixá-los do Cloud Storage.