Cloud Storage for Firebase cho phép bạn tải xuống nhanh chóng và dễ dàng tệp từ Cloud Storage bộ chứa do Firebase cung cấp và quản lý.
Tạo tệp đối chiếu
Để tải một tệp xuống, trước tiên tạo một tệp đối chiếu Cloud Storage vào tệp bạn muốn tải xuống.
Bạn có thể tạo tham chiếu bằng cách thêm đường dẫn con vào thư mục gốc của
Cloud Storage bộ chứa hoặc bạn có thể tạo tệp đối chiếu từ một tệp
URL gs://
hoặc https://
tham chiếu đến một đối tượng trong 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");
Tệp tải xuống
Sau khi có tệp đối chiếu, bạn có thể tải tệp từ Cloud Storage xuống theo 3 cách:
- Tải xuống một vùng đệm trong bộ nhớ
- Tải xuống một đường dẫn cụ thể trên thiết bị
- Tạo URL chuỗi đại diện cho tệp trực tuyến
Tải xuống trong bộ nhớ
Tải tệp xuống vùng đệm byte trong bộ nhớ bằng phương thức GetBytes()
. Chiến dịch này
là cách dễ dàng nhất để nhanh chóng tải một tệp xuống, nhưng tệp phải tải toàn bộ nội dung
của tệp vào bộ nhớ. Nếu bạn yêu cầu tệp lớn hơn kích thước của ứng dụng
bộ nhớ còn trống thì ứng dụng của bạn sẽ gặp sự cố. Để ngăn chặn các vấn đề về bộ nhớ, hãy
hãy đặt kích thước tối đa thành kích thước mà bạn biết rằng ứng dụng của mình có thể xử lý hoặc sử dụng
một phương thức tải xuống khác.
// 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);
Tại thời điểm yêu cầu đã được thực hiện, nhưng chúng ta phải đợi Future hoàn tất thì mới có thể đọc tệp. Vì các trò chơi thường chạy theo vòng lặp và ít được điều khiển bằng lệnh gọi lại hơn so với các ứng dụng khác, nên bạn thường sẽ thăm dò ý kiến để hoàn tất.
// 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" } }
Tải xuống tệp cục bộ
Phương thức GetFile()
tải tệp xuống trực tiếp vào thiết bị cục bộ. Dùng cách này nếu
người dùng của bạn muốn có quyền truy cập vào tệp khi ngoại tuyến hoặc để chia sẻ trong một
ứng dụng khác.
// 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()
lấy một đối số Controller
không bắt buộc
mà bạn có thể dùng để quản lý tệp tải xuống. Xem phần Quản lý tài nguyên tải xuống
để biết thêm thông tin.
Tạo URL tải xuống
Nếu đã có cơ sở hạ tầng tải xuống dựa trên URL hoặc chỉ muốn
một URL cần chia sẻ, bạn có thể lấy URL tải xuống của một tệp bằng cách gọi hàm
Phương thức GetDownloadUrl()
trên tham chiếu 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(); }
Quản lý tệp đã tải xuống
Ngoài việc bắt đầu tải xuống, bạn có thể tạm dừng, tiếp tục và huỷ tải xuống
bằng cách sử dụng các phương thức Pause()
, Resume()
và Cancel()
trên
Controller
mà bạn có thể tuỳ ý chuyển đến
GetBytes()
hoặc 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();
Theo dõi tiến trình tải xuống
Bạn có thể đính kèm trình nghe vào tệp đã tải xuống để theo dõi tiến trình của tải xuống.
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); }
Xử lý lỗi
Có một số lý do khiến lỗi có thể xảy ra khi tải xuống, bao gồm tệp không tồn tại hoặc người dùng không có quyền truy cập tệp mong muốn. Bạn có thể xem thêm thông tin về các lỗi trong Xử lý lỗi của phần Tài liệu.
Các bước tiếp theo
Bạn cũng có thể tải và cập nhật siêu dữ liệu cho các tệp được lưu trữ trong Cloud Storage.