Tải tệp xuống bằng Cloud Storage dành cho Unity

Cloud Storage cho Firebase giú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 tệp đối chiếu trong 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 bộ chứa Cloud Storage 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 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 các tệp xuống từ Cloud Storage theo 4 cách:

  1. Tải xuống từ URL
  2. Tải xuống một mảng byte
  3. Tải xuống kèm theo luồng
  4. 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 của bạn.

Tải xuống từ URL

Nếu muốn sử dụng URL bằng WWW hoặc UnityWebRequest của Unity, bạn có thể nhận 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 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ố. Để tránh các vấn đề về bộ nhớ, hãy nhớ đặt kích thước tối đa thành giá trị nào đó 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 một luồng

Việc tải tệp xuống bằng một Luồng cho phép bạn xử lý dữ liệu khi tải xong. Nhờ đó, bạn có thể linh hoạt tối đa khi xử lý tệp tải xuống. Gọi điện GetStreamAsync() rồi truyền trình xử lý luồng của riêng bạn làm đối số đầu tiên. Người được uỷ quyền này sẽ được gọi trên một luồng trong nền có một Luồng cho phép bạn thực hiện các thao tác hoặc phép tính chuyên sâu về độ trễ 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 các đối số không bắt buộc sau trình xử lý luồng cho phép bạn huỷ hoạt động 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() sẽ tải tệp trực tiếp xuống 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 không có mạng hoặc muốn chia sẻ tệp trong ứ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 của tải xuống. Trình nghe này tuân theo System.IProgress<T> tiêu chuẩn . Bạn có thể dùng một thực thể của lớp StorageProgress để cung cấp Action<T> của riêng bạn làm lệnh gọi lại để đánh 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 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.