Как загружать файлы с помощью Cloud Storage для C++

Cloud Storage for Firebase позволяет быстро и легко загружать файлы в сегмент Cloud Storage, предоставляемый и управляемый Firebase.

Создание ссылки

Чтобы загрузить файл, сначала создайте ссылку Cloud Storage на место в Cloud Storage, куда вы хотите загрузить файл.

Вы можете создать ссылку, добавив дочерние пути к корню сегмента 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

Вы не можете загрузить данные со ссылкой на корневой каталог сегмента Cloud Storage. Ссылка должна указывать на дочерний URL.

Загрузка файлов

После этого вы сможете загружать файлы в Cloud Storage двумя способами:

  1. Загрузка из буфера байтов в памяти
  2. Загрузка из файла на устройстве

Загрузка из данных в памяти

Метод PutData() – самый простой способ загрузить файл в Cloud Storage. PutData() принимает буфер байтов и возвращает Future<Metadata>, который будет содержать информацию о файле после завершения Future. Вы можете использовать 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);

Запрос уже отправлен, но нам нужно дождаться завершения Future, прежде чем файл будет загружен. Поскольку игры обычно выполняются в цикле и меньше зависят от обратных вызовов, чем другие приложения, вы, как правило, будете опрашивать завершение.

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

Загрузка из локального файла

Вы можете загружать локальные файлы на устройства, например фотографии и видео с камеры, с помощью метода PutFile(). PutFile() принимает std::string, представляющий путь к файлу, и возвращает Future<Metadata>, который будет содержать информацию о файле после завершения Future. Для управления загрузкой и отслеживания ее статуса можно использовать 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();
}

Если вы хотите активно управлять загрузкой, то можете передать Controller в методы PutFile() или PutBytes(). Это позволяет использовать контроллер для наблюдения за текущей операцией загрузки. Подробнее об управлении загрузками…

Добавить метаданные файла

При загрузке файлов вы также можете добавить метаданные. Эти метаданные содержат типичные свойства метаданных файла, такие как name, size и content_type (обычно называемый MIME-типом). Метод PutFile() автоматически определяет тип контента по расширению файла, но вы можете переопределить его, указав content_type в метаданных. Если вы не укажете content_type и Cloud Storage не сможет определить значение по умолчанию на основе расширения имени файла, Cloud Storage использует application/octet-stream. Подробнее о метаданных файлов…

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

Управление загрузками

Вы можете не только запускать загрузку, но и приостанавливать, возобновлять и отменять ее с помощью методов Pause(), Resume() и Cancel() в Controller, которые можно передавать в методы PutBytes() или 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();

Как отслеживать ход загрузки

Вы можете прикрепить прослушиватели к загрузкам, чтобы отслеживать их ход.

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

Обработка ошибок

Ошибки при загрузке могут возникать по разным причинам, например если локальный файл не существует или у пользователя нет разрешения на загрузку нужного файла. Дополнительную информацию об ошибках можно найти в разделе Обработка ошибок.

Дальнейшие действия

Теперь, когда вы загрузили файлы, давайте узнаем, как их скачать из Cloud Storage.