Fazer upload de arquivos com o Cloud Storage para C++

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 no local do Cloud Storage para onde quer enviar o arquivo.

Você pode criar uma referência anexando caminhos filho à raiz do armazenamento:

// Create a root reference
StorageReference storage_ref = storage->GetReference();

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

// Create a reference to 'images/mountains.jpg'
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.full_path() == mountain_images_ref.full_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 um buffer 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 PutData() é a maneira mais simples de fazer upload de um arquivo para o Cloud Storage. O PutData() recebe um buffer de bytes e retorna um Future<Metadata> que contém informações sobre o arquivo quando o Future for concluído. Use um Controller para gerenciar seu upload e monitorar o status dele.

// Data in memory
const size_t kByteBufferSize = ...
uint8_t byte_buffer[kByteBufferSize] = { ... };

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

// Upload the file to the path "images/rivers.jpg"
Future future = rivers_ref.PutBytes(byte_buffer, kByteBufferSize);

Neste ponto, a solicitação já foi feita, mas temos que esperar o Future ser concluído antes de fazer upload do arquivo. Como os jogos geralmente são executados em um loop e têm menos retornos de chamada do que outros apps, você normalmente terá que solicitar a conclusão.

if (future.status() != firebase::kFutureStatusPending) {
  if (future.status() != firebase::kFutureStatusComplete) {
    LogMessage("ERROR: GetData() returned an invalid future.");
    // Handle the error...
  } else if (future.Error() != firebase::storage::kErrorNone) {
    LogMessage("ERROR: GetData() returned error %d: %s", future.Error(),
               future.error_message());
    // Handle the error...
    }
  } else {
    // Metadata contains file metadata such as size, content-type, and download URL.
    Metadata* metadata = future.Result();
    std::string download_url = metadata->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 PutFile(). O PutFile() recebe um std::string que representa um caminho para o arquivo e retorna um Future<Metadata> que contém informações sobre o arquivo quando o Future for concluído. Use um Controller para gerenciar seu upload e monitorar o status dele.

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

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

// Upload the file to the path "images/rivers.jpg"
Future future = rivers_ref.PutFile(localFile);

// Wait for Future to complete...

if (future.Error() != firebase::storage::kErrorNone) {
  // Uh-oh, an error occurred!
} else {
  // Metadata contains file metadata such as size, content-type, and download URL.
  Metadata* metadata = future.Result();
  std::string download_url = metadata->download_url();
}

Se você quiser gerenciar seu upload ativamente, forneça um Controller para os métodos PutFile() ou PutBytes(). Isso permite que você use o controlador para observar a operação de upload em andamento. Consulte mais informações em 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 content_type, frequentemente chamadas de tipo MIME. O método PutFile() infere automaticamente o tipo de conteúdo da extensão do nome do arquivo, mas é possível modificar o tipo detectado automaticamente ao especificar content_type nos metadados. Se você não fornecer um content_type 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
StorageReference mountains_ref = storage_ref.Child("images/mountains.jpg");

// Create file metadata including the content type
StorageMetadata metadata;
metadata.set_content_type("image/jpeg");

// Upload data and metadata
mountains_ref.PutBytes(data, metadata);

// Upload file and metadata
mountains_ref.PutFile(local_file, metadata);

Gerenciar uploads

Além de iniciar uploads, você pode pausar, retomar e cancelar uploads usando os métodos Pause(), Resume() e Cancel() em Controller que você pode opcionalmente transmitir para os métodos PutBytes() ou PutFile().

// Start uploading a file
firebase::storage::Controller controller;
storage_ref.Child("images/mountains.jpg").PutFile(local_file, nullptr, &controller);

// Pause the upload
controller.Pause();

// Resume the upload
controller.Resume();

// Cancel the upload
controller.Cancel();

Monitorar o andamento do upload

Você pode anexar listeners aos uploads para monitorar o andamento deles.

class MyListener : public firebase::storage::Listener {
 public:
  virtual void OnProgress(firebase::storage::Controller* controller) {
    // A progress event occurred
  }
};

{
  // Start uploading a file
  MyEventListener my_listener;
  storage_ref.Child("images/mountains.jpg").PutFile(local_file, my_listener);
}

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.