使用 Cloud Storage for Unity 上傳文件

Cloud Storage for Firebase 可讓您快速輕鬆地將文件上傳到 Firebase 提供和管理的Cloud Storage 存儲分區。

創建參考

要上傳文件,請先創建對要上傳的文件的 Cloud Storage 引用

您可以通過將子路徑附加到 Cloud Storage 存儲桶的根目錄來創建引用,也可以從引用 Cloud Storage 中的對象的現有gs://https:// URL 創建引用。

// 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);

您無法上傳引用 Cloud Storage 存儲分區根目錄的數據。您的引用必須指向子 URL。

上傳文件

獲得參考後,您可以通過兩種方式將文件上傳到 Cloud Storage:

  1. 從內存中的字節數組上傳
  2. 從代表設備上文件的文件路徑上傳

從內存中的數據上傳

PutBytesAsync()方法是將文件上傳到 Cloud Storage 的最簡單方法。 PutBytesAsync()接受一個 byte[] 並返回一個System.Task<Firebase.Storage.StorageMetadata> ,其中將包含有關任務完成時文件的信息。您可以選擇使用IProgress<UploadState> (通常是StorageProgress<UploadState> )來監控您的上傳狀態。

// 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);
        }
    });

從本地文件上傳

您可以使用PutFileAsync()方法在設備上上傳本地文件,例如來自相機的照片和視頻。 PutFileAsync()接受一個表示文件路徑的string並返回一個System.Task<Firebase.Storage.StorageMetadata> ,其中將包含任務完成時有關文件的信息。您可以選擇使用IProgress<UploadState> (通常是StorageProgress<UploadState> )來監控您的上傳狀態。

// 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);
        }
    });

如果您想主動監控您的上傳,您可以使用StorageProgress類或您自己的實現IProgress<UploadState>的類,以及PutFileAsync()PutBytesAsync()方法。有關詳細信息,請參閱管理上傳

添加文件元數據

您還可以在上傳文件時包含元數據。此元數據包含典型的文件元數據屬性,例如NameSizeContentType (通常稱為 MIME 類型)。 PutFileAsync()方法自動從文件擴展名推斷內容類型,但您可以通過在元數據中指定ContentType來覆蓋自動檢測到的類型。如果您不提供ContentType並且 Cloud Storage 無法從文件擴展名推斷默認值,則 Cloud Storage 使用application/octet-stream 。有關文件元數據的更多信息,請參閱使用文件元數據部分。

// 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(...

監控上傳進度

您可以將偵聽器附加到上傳以監控上傳進度。偵聽器遵循標準System.IProgress<T>接口。您可以使用StorageProgress類的實例來提供您自己的Action<T>作為進度滴答的回調。

// 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.");
    }
});

錯誤處理

上傳時可能出現錯誤的原因有很多,包括本地文件不存在,或者用戶沒有上傳所需文件的權限。您可以在文檔的處理錯誤部分找到有關錯誤的更多信息。

下一步

現在您已經上傳了文件,讓我們學習如何從 Cloud Storage下載它們