Fazer upload de arquivos com o Cloud Storage para Unity

Com o Cloud Storage, os desenvolvedores ganham rapidez e facilidade ao fazer upload de arquivos para um intervalo do Google Cloud Storage fornecido e gerenciado pelo Firebase.

Criar uma referência

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

Crie uma referência anexando caminhos filhos à raiz de armazenamento ou crie uma referência a partir de um URL gs:// ou https:// existente, referenciando um objeto no Cloud Storage.

// Create a root reference
Firebase.Storage.StorageReference storage_ref = storage.Reference();

// Create a reference to "mountains.jpg"
Firebase.Storage.StorageReference mountains_ref = storage_ref.Child("mountains.jpg");

// Create a reference to 'images/mountains.jpg'
Firebase.Storage.StorageReference mountain_images_ref =
  storage_ref.Child("images/mountains.jpg");

// While the file names are the same, the references point to different files
mountains_ref.Name == mountain_images_ref.Name; // true
mountains_ref.Path == mountain_images_ref.Path; // false

Não é possível fazer o upload de dados com uma referência à raiz do seu intervalo do Google Cloud Storage. Sua referência precisa apontar para um URL filho.

Fazer upload de arquivos

Quando você tiver uma referência, pode fazer upload dos arquivos para o Cloud Storage de duas maneiras:

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

Fazer 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() recebe um byte[] e retorna um System.Task<Firebase.Storage.StorageMetadata> com informações sobre o arquivo quando a tarefa é concluída. Como opção, você pode usar um IProgress<UploadState> (geralmente StorageProgress<UploadState>) para monitorar seu status de upload.

// Data in memory
var custom_bytes = new byte[] { ... };

// Create a reference to the file you want to upload
Firebase.Storage.StorageReference rivers_ref = storage_ref.Child("images/rivers.jpg");

// Upload the file to the path "images/rivers.jpg"
rivers_ref.PutBytesAsync(custom_bytes)
  .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.
        Firebase.Storage.StorageMetadata metadata = task.Result;
        string download_url = metadata.DownloadUrl.ToString();
        Debug.Log("Finished uploading...");
        Debug.Log("download url = " + download_url);
    }
});

Fazer upload 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() recebe uma string que representa um caminho para o arquivo e retorna um System.Task<Firebase.Storage.StorageMetadata> com informações sobre o arquivo quando a tarefa é concluída. Como opção, você pode usar um IProgress<UploadState> (geralmente StorageProgress<UploadState>) para monitorar seu status de upload.

// File located on disk
string local_file = ...

// Create a reference to the file you want to upload
Firebase.Storage.StorageReference rivers_ref = storage_ref.Child("images/rivers.jpg");

// Upload the file to the path "images/rivers.jpg"
rivers_ref.PutFileAsync(local_file)
  .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.
      Firebase.Storage.StorageMetadata metadata = task.Result;
      string download_url = metadata.DownloadUrl.ToString();
      Debug.Log("Finished uploading...");
      Debug.Log("download url = " + download_url);
    }
  });

Se você quiser monitorar ativamente seu upload, use uma classe StorageProgress ou sua própria classe que implemente o IProgress<UploadState> com os métodos PutFileAsync() ou PutBytesAsync(). Consulte mais informações na seção Gerenciar uploads.

Adicionar metadados de arquivo

Você também pode incluir metadados quando fizer upload de arquivos. Em geral, esses metadados contêm propriedades típicas de arquivo, como Name, Size e ContentType, frequentemente chamadas de tipo MIME. O método PutFileAsync() infere automaticamente o tipo de conteúdo da extensão do nome do arquivo, mas é possível modificar o tipo detectado automaticamente ao especificar ContentType nos metadados. Se você não fornecer um ContentType e o Cloud Storage não for capaz de inferir um padrão a partir da extensão de arquivo, o Cloud Storage usará application/octet-stream. Veja mais informações sobre metadados de arquivo na seção Usar metadados de arquivo.

// Create storage reference
Firebase.Storage.StorageReference mountains_ref = storage_ref.Child("images/mountains.jpg");

var custom_bytes = new byte[] { ... };

// Create file metadata including the content type
var new_metadata = new Firebase.Storage.MetadataChange();
new_metadata.ContentType = "image/jpeg";

// Upload data and metadata
mountains_ref.PutBytesAsync(custom_bytes, new_metadata, null,
                            CancellationToken.None, null);  // .ContinueWith(...
// Upload file and metadata
mountains_ref.PutFileAsync(local_file, new_metadata, null,
                           CancellationToken.None, null);  // .ContinueWith(...

Monitorar o andamento do upload

Você pode anexar listeners aos uploads para monitorar o andamento deles. O listener segue a interface System.IProgress<T> padrão. Use uma instância da classe StorageProgress para fornecer a própria Action<T> como retorno de chamada para verificação do andamento.

// Start uploading a file
var task = storage_ref.Child("images/mountains.jpg")
    .PutFileAsync(local_file, null,
      new Firebase.Storage.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.ContinueWith(resultTask => {
    if (!resultTask.IsFaulted && !resultTask.IsCancelled) {
        Debug.Log("Upload finished.");
    }
});

Como lidar com erros

Há diversos motivos pelos quais erros podem ocorrer, como arquivo não existente, usuário sem permissão para acessar o arquivo desejado ou cancelamento do upload do arquivo por parte do usuário. Encontre mais informações sobre erros na seção Como lidar com erros da documentação.

Próximas etapas

Agora que você já sabe fazer upload de arquivos, veja como fazer o download no Cloud Storage.

Enviar comentários sobre…

Precisa de ajuda? Acesse nossa página de suporte.