Fazer upload de arquivos com Cloud Storage para C++

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 local no Cloud Storage para o qual você deseja fazer upload do arquivo.

Você pode criar uma referência anexando caminhos secundários à raiz do bucket do Cloud Storage:

// 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 upload de dados com referência à raiz do intervalo 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 um buffer 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 PutData() é a maneira mais simples de fazer upload de um arquivo para o Cloud Storage. PutData() pega um buffer de bytes e retorna um Future<Metadata> que conterá informações sobre o arquivo quando o Future for concluído. Você pode usar um Controller para gerenciar seu upload e monitorar seu status.

// 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 momento a solicitação foi feita, mas temos que esperar que o Future seja concluído antes que o arquivo seja carregado. Como os jogos normalmente são executados em loop e são menos orientados por retorno de chamada do que outros aplicativos, você normalmente fará uma pesquisa para 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();
  }
}

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 PutFile() . PutFile() pega um std::string representando o caminho para o arquivo e retorna um Future<Metadata> que conterá informações sobre o arquivo quando o Future for concluído. Você pode usar um Controller para gerenciar seu upload e monitorar seu status.

// 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 quiser gerenciar ativamente seu upload, você pode fornecer 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 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 content_type (comumente chamado de tipo MIME). O método PutFile() infere automaticamente o tipo de conteúdo da extensão do nome do arquivo, mas você pode substituir o tipo detectado automaticamente especificando content_type nos metadados. Se você não fornecer um content_type 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 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 envios

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 passar 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();

Monitore o progresso do upload

Você pode anexar ouvintes aos uploads para monitorar o progresso do upload.

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

Manipulação de erros

Há vários motivos pelos quais podem ocorrer erros no upload, incluindo o arquivo local não existir 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.