Przesyłaj pliki za pomocą Cloud Storage dla C++

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

Utwórz odniesienie

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

Możesz utworzyć odniesienie, 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 z odniesieniem do katalogu głównego zasobnika Cloud Storage. Twoje odwołanie musi wskazywać na podrzędny adres URL.

Prześlij pliki

Po uzyskaniu referencji możesz przesyłać pliki do Cloud Storage na dwa sposoby:

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

Prześlij z danych znajdujących się w pamięci

Metoda PutData() to najprostszy sposób na przesłanie pliku do Cloud Storage. PutData() pobiera bufor bajtowy i zwraca Future<Metadata> , który będzie zawierał informacje o pliku po zakończeniu Future. Możesz użyć Controller , aby zarządzać przesyłaniem i monitorować jego 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"
Future future = rivers_ref.PutBytes(byte_buffer, kByteBufferSize);

W tym momencie żądanie zostało złożone, ale musimy poczekać, aż plik Future się zakończy, zanim plik zostanie przesłany. Ponieważ gry zazwyczaj działają w pętli i w mniejszym stopniu wymagają wywołań zwrotnych niż inne aplikacje, zazwyczaj będziesz odpytywać o ukończenie.

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

Za pomocą metody PutFile() możesz przesyłać pliki lokalne na urządzenia, takie jak zdjęcia i filmy z aparatu. PutFile() pobiera std::string reprezentujący ścieżkę do pliku i zwraca Future<Metadata> , który będzie zawierał informacje o pliku po zakończeniu Future. Możesz użyć Controller , aby zarządzać przesyłaniem i monitorować jego 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"
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 dostarczyć Controller do metod PutFile() lub PutBytes() . Dzięki temu możesz używać kontrolera do obserwacji trwającej operacji przesyłania. Aby uzyskać więcej informacji, zobacz Zarządzanie przesyłaniem .

Dodaj metadane pliku

Przesyłając pliki, możesz także dołączyć metadane. Te metadane zawierają typowe właściwości metadanych pliku, takie jak name , size i content_type (powszechnie określany jako typ MIME). Metoda PutFile() automatycznie wnioskuje o typ zawartości na podstawie rozszerzenia nazwy pliku, ale można zastąpić typ wykryty automatycznie, określając content_type w metadanych. Jeśli nie podasz content_type i Cloud Storage nie będzie w stanie wywnioskować wartości domyślnej z rozszerzenia pliku, Cloud Storage użyje application/octet-stream . Aby uzyskać więcej informacji na temat metadanych plików, zobacz sekcję Użyj 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ądzaj przesyłaniem

Oprócz rozpoczynania przesyłania możesz wstrzymywać, wznawiać i anulować przesyłanie za pomocą metod Pause() , Resume() i Cancel() na 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();

Monitoruj postęp przesyłania

Możesz dołączyć słuchaczy do przesyłanych plików, aby monitorować postęp przesyłania.

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

Istnieje wiele powodów, dla których mogą wystąpić błędy podczas przesyłania, na przykład nieistniejący plik lokalny lub brak uprawnień użytkownika do przesłania żądanego pliku. Więcej informacji na temat błędów można znaleźć w sekcji Obsługiwanie błędów w dokumentacji.

Następne kroki

Po przesłaniu plików nauczmy się, jak je pobrać z Cloud Storage.