Cloud Storage for Firebase позволяет быстро и легко скачивать файлы из предоставленного и управляемого Firebase сегмента Cloud Storage.
Создание ссылки
Чтобы скачать файл, сначала создайте ссылку Cloud Storage на нужный файл.
Вы можете создать ссылку, добавив дочерние пути к корневому каталогу корзины Cloud Storage, или создать ссылку из существующего URL gs:// или https://, указывающего на объект в Cloud Storage.
// Create a reference with an initial file path and name StorageReference path_reference = storage->GetReference("images/stars.jpg"); // Create a reference from a Cloud Storage URI StorageReference gs_reference = storage->GetReferenceFromUrl("gs://bucket/images/stars.jpg"); // Create a reference from an HTTPS URL // Note that in the URL, characters are URL escaped! StorageReference https_reference = storage->GetReferenceFromUrl("https://firebasestorage.googleapis.com/b/bucket/o/images%20stars.jpg");
Скачивание файлов
После того как вы создадите цифровой отпечаток, вы сможете скачать файлы из Cloud Storage тремя способами:
- Скачивание в буфер памяти
- Скачивание в определенную папку на устройстве
- Создание строкового URL, представляющего файл в интернете
Скачивание в память
Скачайте файл в буфер байтов в памяти, используя метод GetBytes(). Это самый простой способ быстро скачать файл, но при этом его содержимое должно быть загружено в память целиком. Если вы запросите файл большего размера, чем доступно памяти в приложении, произойдет сбой. Чтобы избежать проблем с памятью, задайте максимальный размер, который ваше приложение может обработать, или используйте другой метод скачивания.
// Create a reference to the file you want to download StorageReference island_ref = storage_ref.Child("images/island.jpg"); // Download in memory with a maximum allowed size of 1MB (1 * 1024 * 1024 bytes) const size_t kMaxAllowedSize = 1 * 1024 * 1024 int8_t byte_buffer[kMaxAllowedSize]; firebase::Future<size_t> future = island_ref.GetBytes(byte_buffer, kMaxAllowedSize);
Запрос отправлен, но нам нужно дождаться завершения Future, чтобы прочитать файл. Поскольку игры обычно работают циклически и реже, чем другие приложения, используют обратные вызовы, вам, как правило, нужно будет опрашивать их на предмет завершения.
// In the game loop that polls for the result... if (future.status() != firebase::kFutureStatusPending) { if (future.status() != firebase::kFutureStatusComplete) { LogMessage("ERROR: GetBytes() returned an invalid future."); // Handle the error... } else if (future.Error() != firebase::storage::kErrorNone) { LogMessage("ERROR: GetBytes() returned error %d: %s", future.Error(), future.error_message()); // Handle the error... } else { // byte_buffer is now populated with data for "images/island.jpg" } }
Как скачать в локальный файл
При использовании метода GetFile() файл скачивается непосредственно на локальное устройство. Используйте этот вариант, если пользователям нужен доступ к файлу в офлайн-режиме или они хотят поделиться им в другом приложении.
// Create a reference to the file you want to download StorageReference islandRef = storage_ref.Child("images/island.jpg"]; // Create local filesystem URL const char* local_url = "file:///local/images/island.jpg"; // Download to the local filesystem Future<size_t> future = islandRef.GetFile(local_url); // Wait for Future to complete... if (future.Error() != firebase::storage::kErrorNone) { // Uh-oh, an error occurred! } else { // The file has been downloaded to local file URL "images/island.jpg" }
GetFile() принимает необязательный аргумент Controller, который можно использовать для управления скачиванием. Подробнее о том, как управлять скачиванием файлов…
Как создать URL для скачивания
Если у вас уже есть инфраструктура для скачивания на основе URL или вы просто хотите поделиться URL, вы можете получить URL для скачивания файла, вызвав метод GetDownloadUrl() для ссылки Cloud Storage.
// Create a reference to the file you want to download StorageReference stars_ref = storage_ref.Child("images/stars.jpg"); // Fetch the download URL firebase::Future<std::string> future = stars_ref.GetDownloadUrl(); // Wait for Future to complete... if (future.Error() != firebase::storage::kErrorNone) { // Uh-oh, an error occurred! } else { // Get the download URL for 'images/stars.jpg' std::string download_url = future.Result(); }
Управление скачанными файлами
Помимо запуска скачивания, вы можете приостанавливать, возобновлять и отменять его с помощью методов Pause(), Resume() и Cancel() на объекте Controller, который можно передать методам GetBytes() или GetFile().
// Start downloading a file Controller controller; storage_ref.Child("images/mountains.jpg").GetFile(local_file, nullptr, &controller); // Pause the download controller.Pause(); // Resume the download controller.Resume(); // Cancel the download 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").GetFile(local_file, my_listener); }
Обработка ошибок
Причины ошибок при скачивании могут быть разными, например файл не существует или у пользователя нет разрешения на доступ к нему. Дополнительную информацию об ошибках можно найти в разделе Обработка ошибок документации.
Дальнейшие действия
Вы также можете получать и обновлять метаданные файлов, хранящихся в Cloud Storage.