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

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

Crie uma referência

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

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 reference with an initial file path and name
StorageReference path_reference = storage->GetReference("images/stars.jpg");

// Create a reference from a Cloud Storage URI
StorageReference gs_reference = storage->GetReferenceFromUrl("gs://bucket/images/stars.jpg");

// Create a reference from an HTTPS URL
// Note that in the URL, characters are URL escaped!
StorageReference https_reference = storage->GetReferenceFromUrl("https://firebasestorage.googleapis.com/b/bucket/o/images%20stars.jpg");

Baixar arquivos

Depois de ter uma referência, você poderá baixar arquivos do Cloud Storage de três maneiras:

  1. Baixe para um buffer na memória
  2. Baixe para um caminho específico no dispositivo
  3. Gere um URL de string representando o arquivo online

Baixar na memória

Baixe o arquivo para um buffer de bytes na memória usando o método GetBytes() . Esta é a maneira mais fácil de baixar um arquivo rapidamente, mas deve carregar todo o conteúdo do arquivo na memória. Se você solicitar um arquivo maior que a memória disponível do seu aplicativo, ele irá travar. Para se proteger contra problemas de memória, defina o tamanho máximo para algo que você sabe que seu aplicativo pode suportar ou use outro método de download.

// Create a reference to the file you want to download
StorageReference island_ref = storage_ref.Child("images/island.jpg");

// Download in memory with a maximum allowed size of 1MB (1 * 1024 * 1024 bytes)
const size_t kMaxAllowedSize = 1 * 1024 * 1024
int8_t byte_buffer[kMaxAllowedSize];
firebase::Future future = island_ref.GetBytes(byte_buffer, kMaxAllowedSize);

Neste momento a solicitação foi feita, mas temos que esperar que o Future seja concluído antes de podermos ler o arquivo. 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.

// In the game loop that polls for the result...

if (future.status() != firebase::kFutureStatusPending) {
  if (future.status() != firebase::kFutureStatusComplete) {
    LogMessage("ERROR: GetBytes() returned an invalid future.");
    // Handle the error...
  } else if (future.Error() != firebase::storage::kErrorNone) {
    LogMessage("ERROR: GetBytes() returned error %d: %s", future.Error(),
               future.error_message());
    // Handle the error...
  } else {
    // byte_buffer is now populated with data for "images/island.jpg"
  }
}

Baixar para um arquivo local

O método GetFile() baixa um arquivo diretamente para um dispositivo local. Use isto se seus usuários quiserem ter acesso ao arquivo off-line ou compartilhar em um aplicativo diferente.

// Create a reference to the file you want to download
StorageReference islandRef = storage_ref.Child("images/island.jpg"];

// Create local filesystem URL
const char* local_url = "file:///local/images/island.jpg";

// Download to the local filesystem
Future future = islandRef.GetFile(local_url);

// Wait for Future to complete...

if (future.Error() != firebase::storage::kErrorNone) {
  // Uh-oh, an error occurred!
} else {
  // The file has been downloaded to local file URL "images/island.jpg"
}

GetFile() recebe um argumento Controller opcional que você pode usar para gerenciar seu download. Consulte Gerenciar downloads para obter mais informações.

Gere um URL de download

Se você já possui uma infraestrutura de download baseada em URLs ou apenas deseja compartilhar um URL, poderá obter o URL de download de um arquivo chamando o método GetDownloadUrl() em uma referência do Cloud Storage.

// Create a reference to the file you want to download
StorageReference stars_ref = storage_ref.Child("images/stars.jpg");

// Fetch the download URL
firebase::Future future = stars_ref.GetDownloadUrl();

// Wait for Future to complete...

if (future.Error() != firebase::storage::kErrorNone) {
  // Uh-oh, an error occurred!
} else {
  // Get the download URL for 'images/stars.jpg'
  std::string download_url = future.Result();
}

Gerenciar downloads

Além de iniciar downloads, você pode pausar, retomar e cancelar downloads usando os métodos Pause() , Resume() e Cancel() em Controller , que você pode opcionalmente passar para os métodos GetBytes() ou GetFile() .

// Start downloading a file
Controller controller;
storage_ref.Child("images/mountains.jpg").GetFile(local_file, nullptr, &controller);

// Pause the download
controller.Pause();

// Resume the download
controller.Resume();

// Cancel the download
controller.Cancel();

Monitore o progresso do download

Você pode anexar ouvintes aos downloads para monitorar o andamento do download.

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").GetFile(local_file, my_listener);
}

Lidar com erros

Existem vários motivos pelos quais podem ocorrer erros no download, incluindo o arquivo não existir ou o usuário não ter permissão para acessar o arquivo desejado. Mais informações sobre erros podem ser encontradas na seção Tratar erros da documentação.

Próximos passos

Você também pode receber e atualizar metadados de arquivos armazenados no Cloud Storage.