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ępnionego i zarządzanego przez Firebase.

Tworzenie referencji

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

Możesz utworzyć odwołanie, 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 przesłać danych odwołujących się do katalogu głównego zasobnika Cloud Storage. Odwoływanie musi wskazywać adres URL podrzędny.

Prześlij pliki

Po uzyskaniu odwołania możesz przesyłać pliki do usługi Cloud Storage na 2 sposoby:

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

Przesyłanie danych z pamięci

Metoda PutData() jest najprostszym sposobem przesyłania plików do usługi Cloud Storage. PutData() przyjmuje bufor bajtów i zwraca Future<Metadata>, który zawiera informacje o pliku po zakończeniu działania Future. Za pomocą Controller możesz zarządzać przesyłaniem i sprawdzać jego stan.

// 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 tym momencie żądanie zostało już wysłane, ale musimy poczekać, aż Future zakończy działanie, zanim plik zostanie przesłany. Gry zwykle działają w pętli i są mniej wywoływane niż inne aplikacje, dlatego sondowanie jest zwykle przeprowadzane w celu ukończenia.

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

Prześlij z pliku lokalnego

Metoda PutFile() umożliwia przesyłanie plików lokalnych z urządzeń, np. zdjęć i filmów z aparatu. PutFile() przyjmuje std::string reprezentujący ścieżkę do pliku i zwraca Future<Metadata>, który będzie zawierać informacje o pliku po zakończeniu działania funkcji Future. Za pomocą pliku Controller możesz zarządzać przesyłaniem i monitorować jego stan.

// 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łanymi danymi, możesz podać Controller do metod PutFile() lub PutBytes(). Dzięki temu możesz używać kontrolera do obserwowania 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. Zawierają one typowe właściwości metadanych plików, takie jak name, size i content_type (powszechnie nazywane typem MIME). Metoda PutFile() automatycznie wywnioskuje typ treści na podstawie rozszerzenia nazwy pliku, ale możesz zastąpić automatycznie wykryty typ, podając content_type w metadanych. Jeśli nie podasz wartości content_type, a Cloud Storage nie będzie mogła wywnioskować domyślnej wartości na podstawie rozszerzenia pliku, Cloud Storage użyje wartości application/octet-stream. Więcej informacji o metadanych plików znajdziesz w sekcji Używanie metadanych plików.

// 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ądzaj przesyłaniem

Oprócz inicjowania przesyłania możesz wstrzymywać, wznawiać i anulować przesyłanie za pomocą metod Pause(), Resume()Cancel() w funkcji Controller. Metody te 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 przesłanych detektorów.

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 różnych powodów, na przykład dlatego, że plik lokalny nie istnieje lub użytkownik nie ma uprawnień do przesłania odpowiedniego pliku. Więcej informacji o błędach znajdziesz w sekcji Przetwarzanie błędów w dokumentacji.

Następne kroki

Ponieważ pliki zostały już przesłane, dowiedz się, jak je pobraćCloud Storage.