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

Cloud Storage for Firebase cho phép bạn tải tệp xuống một cách nhanh chóng và dễ dàng từ mộ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 tệp đối chiếu Cloud Storage đến tệp bạn muốn tải xuống.

Bạn có thể tạo tệp đối 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 có thể tạo tệp đối 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ải tệp xuống

Sau khi có tệp đối chiếu, bạn có thể tải tệp xuống từ Cloud Storage theo 4 cách:

  1. Tải xuống từ một URL
  2. Tải xuống một mảng byte
  3. Tải xuống bằng Stream
  4. Tải xuống tệp trên thiết 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ừ một URL

Nếu muốn sử dụng URL với 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ớ hiện có của ứng dụng, thì ứng dụng sẽ gặp sự cố. Để bảo vệ khỏi các vấn đề về bộ nhớ, hãy nhớ đặt kích thước tối đa thành một giá trị 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 một sự kiện phát trực tiếp

Việc tải tệp xuống bằng Luồng cho phép bạn xử lý dữ liệu khi dữ liệu được tải. Điều này giúp bạn linh hoạt tối đa khi xử lý tệp tải xuống. Gọi GetStreamAsync() và truyền bộ xử lý theo luồng của riêng bạn làm đối số đầu tiên. Đại diện này sẽ được gọi trên một luồng nền có 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 các đối số không bắt buộc sau bộ xử lý theo 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 trên thiết bị

Phương thức GetFileAsync() tải tệp trực tiếp xuống thiết bị cục bộ. Hãy sử dụng cách 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> 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 bạn dưới dạng lệnh gọi lại cho các mốc 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.