Cloud Storage for Firebase позволяет быстро и легко скачивать файлы из корзины Cloud Storage, предоставленной и управляемой Firebase.
Создание ссылки
Чтобы скачать файл, сначала создайте ссылку 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.