Carica file con Cloud Storage per C++

Cloud Storage for Firebase ti consente di caricare file in modo rapido e semplice in un Cloud Storage bucket fornito e gestito da Firebase.

Creazione di un riferimento

Per caricare un file, innanzitutto crea un Cloud Storage riferimento alla posizione in Cloud Storage in cui vuoi caricare il file.

Puoi creare un riferimento aggiungendo percorsi secondari alla radice del tuo Cloud Storage bucket:

// 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

Non puoi caricare dati con un riferimento alla radice del tuo Cloud Storage bucket. Il riferimento deve rimandare a un URL secondario.

Carica file

Una volta creato un riferimento, puoi caricare i file in Cloud Storage in due modi:

  1. Caricamento da un buffer di byte in memoria
  2. Caricamento da un percorso file che rappresenta un file sul dispositivo

Caricamento da dati in memoria

Il metodo PutData() è il modo più semplice per caricare un file in Cloud Storage. PutData() accetta un buffer di byte e restituisce un Future<Metadata> che conterrà informazioni sul file al completamento di Future. Puoi utilizzare un Controller per gestire il caricamento e monitorarne lo stato.

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

A questo punto, la richiesta è stata effettuata, ma dobbiamo attendere il completamento di Future prima che il file venga caricato. Poiché i giochi in genere vengono eseguiti in un loop e sono meno basati su callback rispetto ad altre applicazioni, in genere esegui il polling per il completamento.

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

Caricamento da un file locale

Puoi caricare file locali sui dispositivi, ad esempio foto e video dalla fotocamera, con il metodo PutFile(). PutFile() accetta un std::string che rappresenta il percorso del file e restituisce un Future<Metadata> che conterrà informazioni sul file al completamento di Future. Puoi utilizzare un Controller per gestire il caricamento e monitorarne lo stato.

// 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 vuoi gestire attivamente il caricamento, puoi fornire un Controller ai metodi PutFile() o PutBytes(). In questo modo, puoi utilizzare il controller per osservare l'operazione di caricamento in corso. Per ulteriori informazioni, consulta Gestisci caricamenti per

Aggiungi metadati dei file

Puoi anche includere i metadati quando carichi i file. Questi metadati contengono proprietà dei metadati dei file tipiche, come name, size e content_type (comunemente denominato tipo MIME). Il metodo PutFile() deduce automaticamente il tipo di contenuti dall'estensione del nome file, ma puoi sostituire il tipo rilevato automaticamente specificando content_type nei metadati. Se non fornisci un content_type e Cloud Storage non riesce a dedurre un valore predefinito da l'estensione del file, Cloud Storage utilizza application/octet-stream. Per ulteriori informazioni sui metadati dei file, consulta la sezione Utilizzare i metadati dei file.

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

Gestisci caricamenti

Oltre ad avviare i caricamenti, puoi metterli in pausa, riprenderli e annullarli utilizzando i metodi Pause(), Resume() e Cancel() su Controller, che puoi facoltativamente passare ai metodi PutBytes() o 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();

Monitora l'avanzamento del caricamento

Puoi collegare listener ai caricamenti per monitorare l'avanzamento del caricamento.

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

Gestione degli errori

Esistono diversi motivi per cui possono verificarsi errori durante il caricamento, ad esempio il file locale non esiste o l'utente non dispone dell'autorizzazione per caricare il file desiderato. Per ulteriori informazioni sugli errori, consulta la sezione Gestire gli errori della documentazione.

Passaggi successivi

Ora che hai caricato i file, scopri come scaricarli da Cloud Storage.