Tải tệp lên bằng Cloud Storage cho Unity

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

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

Để tải tệp lên, trước tiên hãy tạo tham chiếu Cloud Storage cho tệp bạn muốn tải lên.

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 root reference
StorageReference storageRef = storage.RootReference;

// Create a reference to "mountains.jpg"
StorageReference mountainsRef = storageRef.Child("mountains.jpg");

// Create a reference to 'images/mountains.jpg'
StorageReference mountainImagesRef =
    storageRef.Child("images/mountains.jpg");

// While the file names are the same, the references point to different files
Assert.AreEqual(mountainsRef.Name, mountainImagesRef.Name);
Assert.AreNotEqual(mountainsRef.Path, mountainImagesRef.Path);

Bạn không thể tải lên dữ liệu có tham chiếu đến thư mục gốc của bộ chứa Cloud Storage. Tham chiếu của bạn phải trỏ đến URL con.

Tải tập tin lên

Sau khi đã có tài liệu tham khảo, bạn có thể upload file lên Cloud Storage theo 2 cách:

  1. Tải lên từ một mảng byte trong bộ nhớ
  2. Tải lên từ đường dẫn tệp đại diện cho tệp trên thiết bị

Tải lên từ dữ liệu trong bộ nhớ

Phương thức PutBytesAsync() là cách đơn giản nhất để tải tệp lên Cloud Storage. PutBytesAsync() lấy một byte[] và trả về System.Task<Firebase.Storage.StorageMetadata> sẽ chứa thông tin về tệp khi tác vụ hoàn thành. Bạn có thể tùy ý sử dụng IProgress<UploadState> (thường là StorageProgress<UploadState> ) để theo dõi trạng thái tải lên của mình.

// Data in memory
var customBytes = new byte[] {
    /*...*/
};

// Create a reference to the file you want to upload
StorageReference riversRef = storageRef.Child("images/rivers.jpg");

// Upload the file to the path "images/rivers.jpg"
riversRef.PutBytesAsync(customBytes)
    .ContinueWith((Task<StorageMetadata> task) => {
        if (task.IsFaulted || task.IsCanceled) {
            Debug.Log(task.Exception.ToString());
            // Uh-oh, an error occurred!
        }
        else {
            // Metadata contains file metadata such as size, content-type, and md5hash.
            StorageMetadata metadata = task.Result;
            string md5Hash = metadata.Md5Hash;
            Debug.Log("Finished uploading...");
            Debug.Log("md5 hash = " + md5Hash);
        }
    });

Tải lên từ một tập tin cục bộ

Bạn có thể tải các tệp cục bộ lên thiết bị, chẳng hạn như ảnh và video từ máy ảnh, bằng phương thức PutFileAsync() . PutFileAsync() lấy một string biểu thị đường dẫn đến tệp và trả về System.Task<Firebase.Storage.StorageMetadata> sẽ chứa thông tin về tệp khi tác vụ hoàn thành. Bạn có thể tùy ý sử dụng IProgress<UploadState> (thường là StorageProgress<UploadState> ) để theo dõi trạng thái tải lên của mình.

// File located on disk
string localFile = "...";

// Create a reference to the file you want to upload
StorageReference riversRef = storageRef.Child("images/rivers.jpg");

// Upload the file to the path "images/rivers.jpg"
riversRef.PutFileAsync(localFile)
    .ContinueWith((Task<StorageMetadata> task) => {
        if (task.IsFaulted || task.IsCanceled) {
            Debug.Log(task.Exception.ToString());
            // Uh-oh, an error occurred!
        }
        else {
            // Metadata contains file metadata such as size, content-type, and download URL.
            StorageMetadata metadata = task.Result;
            string md5Hash = metadata.Md5Hash;
            Debug.Log("Finished uploading...");
            Debug.Log("md5 hash = " + md5Hash);
        }
    });

Nếu muốn chủ động theo dõi quá trình tải lên của mình, bạn có thể sử dụng lớp StorageProgress hoặc lớp của riêng bạn triển khai IProgress<UploadState> , với các phương thức PutFileAsync() hoặc PutBytesAsync() . Xem Quản lý tải lên để biết thêm thông tin.

Thêm siêu dữ liệu tệp

Bạn cũng có thể bao gồm siêu dữ liệu khi tải tệp lên. Siêu dữ liệu này chứa các thuộc tính siêu dữ liệu tệp điển hình như Name , SizeContentType (thường được gọi là loại MIME). Phương thức PutFileAsync() tự động suy ra loại nội dung từ phần mở rộng tên tệp, nhưng bạn có thể ghi đè loại được phát hiện tự động bằng cách chỉ định ContentType trong siêu dữ liệu. Nếu bạn không cung cấp ContentType và Cloud Storage không thể suy ra giá trị mặc định từ phần mở rộng tệp thì Cloud Storage sẽ sử dụng application/octet-stream . Xem phần Sử dụng siêu dữ liệu tệp để biết thêm thông tin về siêu dữ liệu tệp.

// Create storage reference
StorageReference mountainsRef = storageRef.Child("images/mountains.jpg");

byte[] customBytes = new byte[] {
    /*...*/
};
string localFile = "...";

// Create file metadata including the content type
var newMetadata = new MetadataChange();
newMetadata.ContentType = "image/jpeg";

// Upload data and metadata
mountainsRef.PutBytesAsync(customBytes, newMetadata, null,
    CancellationToken.None); // .ContinueWithOnMainThread(...
// Upload file and metadata
mountainsRef.PutFileAsync(localFile, newMetadata, null,
    CancellationToken.None); // .ContinueWithOnMainThread(...

Theo dõi tiến trình tải lên

Bạn có thể đính kèm người nghe vào video tải lên để theo dõi tiến trình tải lên. 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.

// Start uploading a file
var task = storageRef.Child("images/mountains.jpg")
    .PutFileAsync(localFile, null,
        new StorageProgress<UploadState>(state => {
            // called periodically during the upload
            Debug.Log(String.Format("Progress: {0} of {1} bytes transferred.",
                state.BytesTransferred, state.TotalByteCount));
        }), CancellationToken.None, null);

task.ContinueWithOnMainThread(resultTask => {
    if (!resultTask.IsFaulted && !resultTask.IsCanceled) {
        Debug.Log("Upload finished.");
    }
});

Xử lý lỗi

Có một số lý do khiến lỗi có thể xảy ra khi tải lên, bao gồm cả tệp cục bộ không tồn tại hoặc người dùng không có quyền tải tệp mong muốn lê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ây giờ bạn đã tải tệp lên, hãy tìm hiểu cách tải chúng xuống từ Cloud Storage.