Prześlij pliki za pomocą Cloud Storage dla C++

Cloud Storage for Firebase umożliwia szybkie i łatwe przesyłanie plików do zasobnika Cloud Storage udostępnianego i zarządzanego przez Firebase.

Tworzenie referencji

Aby przesłać plik, najpierw utwórz referencję Cloud Storage do lokalizacji w Cloud Storage, do której chcesz przesłać plik.

Referencję możesz utworzyć, dołączając ścieżki podrzędne do katalogu głównego zasobnika 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

Nie możesz przesyłać danych za pomocą referencji do katalogu głównego swojego Cloud Storage zasobnika. Referencja musi wskazywać adres URL podrzędny.

Przesyłanie plików

Gdy masz już referencję, możesz przesłać pliki do Cloud Storage na 2 sposoby:

  1. Przesyłanie z bufora bajtów w pamięci
  2. Przesyłanie ze ścieżki pliku reprezentującej plik na urządzeniu

Przesyłanie z danych w pamięci

Metoda PutData() to najprostszy sposób przesyłania pliku do Cloud Storage. PutData() przyjmuje bufor bajtów i zwraca Future<Metadata>, który po zakończeniu działania będzie zawierać informacje o pliku. Do zarządzania przesyłaniem i monitorowania jego stanu możesz użyć Controller.

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

W momencie wysłania żądania musimy poczekać na zakończenie działania Future, zanim plik zostanie przesłany. Gry zwykle działają w pętli i są mniej zależne od wywołań zwrotnych niż inne aplikacje, dlatego zwykle sprawdzasz, czy działanie zostało zakończone.

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

Przesyłanie z pliku lokalnego

Za pomocą metody PutFile() możesz przesyłać pliki lokalne na urządzeniach, np. zdjęcia i filmy z aparatu. PutFile() przyjmuje std::string reprezentujący ścieżkę do pliku i zwraca Future<Metadata>, który po zakończeniu działania będzie zawierać informacje o pliku. Do zarządzania przesyłaniem i monitorowania jego stanu możesz użyć Controller.

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

Jeśli chcesz aktywnie zarządzać przesyłaniem, możesz przekazać Controller do metod PutFile() lub PutBytes(). Umożliwi Ci to obserwowanie za pomocą kontrolera trwającej operacji przesyłania. Więcej informacji znajdziesz w sekcji Zarządzanie przesyłaniem.

Dodawanie metadanych pliku

Podczas przesyłania plików możesz też dołączyć metadane. Te metadane zawierają typowe właściwości metadanych pliku, takie jak name, size i content_type (zwykle nazywany typem MIME). Metoda PutFile() automatycznie wywnioskuje typ treści z rozszerzenia nazwy pliku, ale możesz zastąpić automatycznie wykryty typ, określając content_type w metadanych. Jeśli nie podasz content_type, a Cloud Storage nie będzie mógł wywnioskować domyślnego typu z rozszerzenia pliku, Cloud Storage użyje application/octet-stream. Więcej informacji o metadanych pliku znajdziesz w sekcji Używanie metadanych pliku.

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

Zarządzanie przesyłaniem

Oprócz rozpoczynania przesyłania możesz je wstrzymywać, wznawiać i anulować za pomocą metod Pause(), Resume() i Cancel() w Controller, które możesz opcjonalnie przekazać do metod PutBytes() lub 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();

Monitorowanie postępu przesyłania

Aby monitorować postęp przesyłania, możesz dołączyć do niego odbiorniki.

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

Obsługa błędów

Błędy podczas przesyłania mogą wystąpić z wielu powodów, np. z powodu braku pliku lokalnego lub braku uprawnień użytkownika do przesłania wybranego pliku. Więcej informacji o błędach znajdziesz w sekcji Obsługa błędów w dokumentacji.

Następne kroki

Teraz, gdy już wiesz, jak przesyłać pliki, dowiedz się, jak je pobierać z Cloud Storage.