Cloud Storage for Firebase cho phép bạn nhanh chóng và dễ dàng tải xuống các tệp từ bộ chứa Cloud Storage do Firebase cung cấp và quản lý.
Tạo tệp đối chiếu
Để tải tệp xuống, trước tiên, hãy tạo một tệp tham chiếu Cloud Storage đến 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 các đường dẫn con vào gốc của bộ chứa Cloud Storage, hoặc bạn có thể tạo tham chiếu từ URL gs://
hoặc https://
hiện có tham chiếu đến một đối tượng trong Cloud Storage.
// Create a reference with an initial file path and name StorageReference pathReference = storage.GetReference("images/stars.jpg"); // Create a reference from a Google Cloud Storage URI StorageReference gsReference = storage.GetReferenceFromUrl("gs://bucket/images/stars.jpg"); // Create a reference from an HTTPS URL // Note that in the URL, characters are URL escaped! StorageReference httpsReference = 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 4 cách:
- Tải xuống từ URL
- Tải xuống một mảng byte
- Tải xuống qua tính năng Truyền trực tuyến
- Tải xuống tệp cục bộ
Phương thức bạn sẽ sử dụng để truy xuất tệp sẽ phụ thuộc vào cách bạn muốn sử dụng dữ liệu trong trò chơi.
Tải xuống từ URL
Nếu muốn sử dụng một URL bằng WWW
hoặc UnityWebRequest
của Unity, bạn có thể lấy URL tải xuống cho một tệp bằng cách gọi GetDownloadUrlAsync()
.
// Fetch the download URL reference.GetDownloadUrlAsync().ContinueWithOnMainThread(task => { if (!task.IsFaulted && !task.IsCanceled) { Debug.Log("Download URL: " + task.Result); // ... now download the file via WWW or UnityWebRequest. } });
Tải xuống một mảng byte
Bạn có thể tải tệp xuống vùng đệm byte trong bộ nhớ bằng phương thức GetBytesAsync()
.
Phương thức này sẽ tải toàn bộ nội dung của tệp vào bộ nhớ.
Nếu bạn yêu cầu một tệp lớn hơn bộ nhớ còn trống của ứng dụng, ứng dụng sẽ gặp sự cố.
Để ngăn các vấn đề về bộ nhớ, hãy nhớ đặt kích thước tối đa thành kích thước mà bạn biết ứ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.
// Download in memory with a maximum allowed size of 1MB (1 * 1024 * 1024 bytes) const long maxAllowedSize = 1 * 1024 * 1024; reference.GetBytesAsync(maxAllowedSize).ContinueWithOnMainThread(task => { if (task.IsFaulted || task.IsCanceled) { Debug.LogException(task.Exception); // Uh-oh, an error occurred! } else { byte[] fileContents = task.Result; Debug.Log("Finished downloading!"); } });
Tải xuống qua luồng
Việc tải tệp xuống bằng Luồng cho phép bạn xử lý dữ liệu khi tệp được tải.
Nhờ vậy, bạn có thể linh hoạt tối đa khi xử lý tệp tải xuống. Gọi GetStreamAsync()
và truyền trình xử lý luồng của riêng bạn làm đối số đầu tiên.
Phương thức uỷ quyền này sẽ được gọi trên luồng ở chế độ nền bằng một Luồng cho phép bạn thực hiện các phép tính hoặc thao tác có độ trễ cao, chẳng hạn như lưu trữ nội dung vào ổ đĩa.
// Download via a Stream reference.GetStreamAsync(stream => { // Do something with the stream here. // // This code runs on a background thread which reduces the impact // to your framerate. // // If you want to do something on the main thread, you can do that in the // progress eventhandler (second argument) or ContinueWith to execute it // at task completion. }, null, CancellationToken.None);
GetStreamAsync()
nhận một đối số không bắt buộc sau trình xử lý luồng cho phép bạn huỷ thao tác hoặc nhận thông báo về tiến trình.
Tải xuống tệp cục bộ
Phương thức GetFileAsync()
tải tệp xuống trực tiếp vào thiết bị cục bộ. Sử dụng phương thức này nếu người dùng muốn truy cập vào tệp khi không có mạng hoặc chia sẻ tệp trong một ứng dụng khác.
// Create local filesystem URL string localUrl = "file:///local/images/island.jpg"; // Download to the local filesystem reference.GetFileAsync(localUrl).ContinueWithOnMainThread(task => { if (!task.IsFaulted && !task.IsCanceled) { Debug.Log("File downloaded."); } });
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 tải xuống. Trình nghe tuân theo giao diện System.IProgress<T>
tiêu chuẩn. Bạn có thể sử dụng một thực thể của lớp StorageProgress
để cung cấp Action<T>
của riêng mình làm lệnh gọi lại cho các dấu tiến trình.
// Create local filesystem URL string localUrl = "file:///local/images/island.jpg"; // Start downloading a file Task task = reference.GetFileAsync(localFile, new StorageProgress<DownloadState>(state => { // called periodically during the download Debug.Log(String.Format( "Progress: {0} of {1} bytes transferred.", state.BytesTransferred, state.TotalByteCount )); }), CancellationToken.None); task.ContinueWithOnMainThread(resultTask => { if (!resultTask.IsFaulted && !resultTask.IsCanceled) { Debug.Log("Download finished."); } });
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 cả việc tệp không tồn tại hoặc người dùng không có quyền truy cập vào tệp mong muốn. Bạn có thể xem thêm thông tin về lỗi trong phần Xử lý lỗi của tài liệu.
Các bước tiếp theo
Bạn cũng có thể lấy và cập nhật siêu dữ liệu cho các tệp được lưu trữ trong Cloud Storage.