Usar metadados de arquivos com o Cloud Storage para C++

Depois de fazer o upload de um arquivo para a referência do Cloud Storage, também é possível acessar e atualizar os metadados do arquivo para, por exemplo, atualizar o tipo do conteúdo. Os arquivos também podem armazenar os pares de chave/valor personalizados com metadados adicionais.

Acessar metadados de arquivo

Os metadados de arquivos contêm propriedades comuns, como name, size e content_type, que muitas vezes são chamadas de tipo MIME, além de outras menos comuns, como content_disposition e time_created. Esses metadados podem ser recuperados a partir de uma referência do Cloud Storage com o método GetMetadata.

// Create reference to the file whose metadata we want to retrieve
StorageReference forest_ref = storage_ref.Child("images/forest.jpg");

// Get metadata properties
Future future = forest_ref.GetMetadata();

// Wait for Future to complete...

if (future.Error() != firebase::storage::kErrorNone) {
  // Uh-oh, an error occurred!
} else {
  // We can now retrieve the metadata for 'images/forest.jpg'
  Metadata* metadata = future.Result();
}

Atualizar metadados de arquivo

Com o método UpdateMetadata, é possível atualizar os metadados de arquivos após a conclusão do upload. Consulte a lista completa para saber mais sobre as propriedades que podem ser atualizadas. Somente as propriedades especificadas nos metadados são atualizadas. As demais não são modificadas.

// Create reference to the file whose metadata we want to change
firebase::storage::StorageReference forest_ref = storage_ref.child("images/forest.jpg");

// Create file metadata to update
Metadata new_metadata;
newMetadata.set_cache_control("public,max-age=300");
newMetadata.set_content_type("image/jpeg");

// Update metadata properties
Future future = forest_ref.UpdateMetadata(new_metadata);

// Wait for Future to complete...

if (future.Error() != firebase::storage::kErrorNone) {
  // Uh-oh, an error occurred!
} else {
  // We can now retrieve the updated metadata for 'images/forest.jpg'
  Metadata* metadata = future.Result();
}

É possível excluir propriedades de metadados graváveis ao transferir a string vazia:

// Create file metadata with property to delete
StorageMetadata new_metadata;
new_metadata.set_content_type("");

// Delete the metadata property
Future future = forest_ref.UpdateMetadata(new_metadata);

// Wait for Future to complete...

if (future.Error() != 0) {
  // Uh-oh, an error occurred!
} else {
  // metadata.content_type() should be an empty string
  Metadata* metadata = future.Result();
}

Como lidar com erros

Podem ocorrer diferentes erros ao receber ou atualizar metadados, como arquivo inexistente ou usuário sem permissão de acesso ao arquivo desejado. Saiba mais sobre erros na seção Tratar erros.

Metadados personalizados

É possível especificar metadados personalizados como um std::map contendo propriedades std::string.

std::map* custom_metadata = metadata.custom_metadata();
custom_metadata->insert(std::make_pair("location", "Yosemite, CA, USA");
custom_metadata->insert(std::make_pair("activity", "Hiking");

Você pode armazenar dados específicos do app para cada arquivo nos metadados personalizados, mas é altamente recomendável usar um banco de dados (como o Firebase Realtime Database) para armazenar e sincronizar esse tipo de dado.

Propriedades de metadados de arquivo

Veja abaixo uma lista completa de propriedades de metadados em um arquivo:

Propriedade Tipo Gravável
bucket const char* NÃO
generation const char* NÃO
metageneration const char* NÃO
full_path const char* NÃO
name const char* NÃO
size int64_t NÃO
time_created int64_t NÃO
updated int64_t NÃO
cache_control const char* SIM
content_disposition const char* SIM
content_encoding const char* SIM
content_language const char* SIM
content_type const char* SIM
download_urls std::vector<std::string> NÃO
custom_metadata std::map<std::string, std::string> SIM

Próximas etapas

Fazer download, upload e atualizar arquivos são tarefas importantes, mas poder removê-los também é essencial. Saiba como excluir arquivos do Cloud Storage.