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

Cloud Storage cho Firebase cho phép bạn tải xuống tệp nhanh chóng và dễ dàng từ nhóm Cloud Storage do Firebase cung cấp và quản lý.

Tạo một tài liệu tham khảo

Để tải xuống tệp, trước tiên hãy tạo tham chiếu Cloud Storage cho 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 thư mục gốc của nhóm 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ải tập tin

Sau khi đã có tài liệu tham khảo, bạn có thể tải xuống tệp từ Cloud Storage theo bốn 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 luồng
  4. Tải xuống một tập tin cục bộ

Phương pháp bạn sẽ sử dụng để truy xuất tệp của mình sẽ tùy thuộc vào cách bạn muốn sử dụng dữ liệu trong trò chơi của mình.

Tải xuống từ một URL

Nếu bạn muốn sử dụng URL với 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 bộ đệm byte trong bộ nhớ bằng phương thức GetBytesAsync() . Phương pháp này sẽ tải toàn bộ nội dung tệp của bạn vào bộ nhớ. Nếu bạn yêu cầu tệp lớn hơn bộ nhớ khả dụng của ứng dụng, ứng dụng của bạn sẽ gặp sự cố. Để bảo vệ khỏi các vấn đề về bộ nhớ, hãy đảm bảo đặ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 phương pháp 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

Tải xuống tệp bằng Luồng cho phép bạn xử lý dữ liệu khi được tải. Điều này mang lại cho bạn sự linh hoạt tối đa khi xử lý việc tải xuống của bạn. Gọi GetStreamAsync() và chuyển bộ xử lý luồng của riêng bạn làm đối số đầu tiên. Đại biểu 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 thao tác hoặc tính toán chuyên sâu về độ trễ, 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ố tùy chọn sau bộ xử lý luồng cho phép bạn hủy thao tác hoặc nhận thông báo về tiến trình.

Tải xuống một tập tin cục bộ

Phương thức GetFileAsync() tải tệp trực tiếp xuống thiết bị cục bộ. Sử dụng tùy chọn 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ẻ 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 các bản 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 phiên bản của lớp StorageProgress để cung cấp Action<T> của riêng bạn làm lệnh gọi lại cho các dấu tích 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ả 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ể tìm thêm thông tin về lỗi trong phần Xử lý lỗi của tài liệu.

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.