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:
- Upload de um buffer de bytes na memória
- 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" Futurefuture = 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" Futurefuture = 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.