Cloud Storage for Firebase ช่วยให้คุณดาวน์โหลดไฟล์จากที่เก็บข้อมูล Cloud Storage ที่ Firebase จัดหาและจัดการได้อย่างรวดเร็วและง่ายดาย
สร้างการอ้างอิง
หากต้องการดาวน์โหลดไฟล์ ก่อนอื่น ให้สร้างCloud Storageการอ้างอิงสำหรับไฟล์ที่ต้องการดาวน์โหลด
คุณสร้างการอ้างอิงได้โดยเพิ่มเส้นทางย่อยต่อท้ายรูทของที่เก็บข้อมูล Cloud Storage หรือจะสร้างการอ้างอิงจาก URL gs://
หรือ https://
ที่มีอยู่ซึ่งอ้างอิงออบเจ็กต์ใน 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");
ดาวน์โหลดไฟล์
เมื่อมีข้อมูลอ้างอิงแล้ว คุณจะดาวน์โหลดไฟล์จาก Cloud Storage ได้ 4 วิธีดังนี้
- ดาวน์โหลดจาก URL
- ดาวน์โหลดลงในอาร์เรย์ไบต์
- ดาวน์โหลดด้วยสตรีม
- ดาวน์โหลดลงในไฟล์ในเครื่อง
วิธีที่คุณจะใช้เรียกข้อมูลไฟล์จะขึ้นอยู่กับวิธีที่คุณต้องการใช้ข้อมูลในเกม
ดาวน์โหลดจาก URL
หากต้องการใช้ URL กับ WWW
หรือ UnityWebRequest
ของ Unity คุณสามารถรับ URL ดาวน์โหลดของไฟล์ได้โดยเรียกใช้ 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. } });
ดาวน์โหลดลงในอาร์เรย์ไบต์
คุณสามารถดาวน์โหลดไฟล์ไปยังบัฟเฟอร์ไบต์ในหน่วยความจําได้โดยใช้เมธอด GetBytesAsync()
วิธีนี้จะโหลดเนื้อหาทั้งหมดของไฟล์ลงในหน่วยความจำ
หากคุณขอไฟล์ที่มีขนาดใหญ่กว่าหน่วยความจำที่พร้อมใช้งานของแอป แอปจะขัดข้อง
โปรดตรวจสอบว่าได้ตั้งค่าขนาดสูงสุดเป็นค่าที่คุณทราบว่าแอปจัดการได้ หรือใช้วิธีการดาวน์โหลดอื่นเพื่อปกป้องปัญหาเกี่ยวกับหน่วยความจำ
// 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!"); } });
ดาวน์โหลดผ่านสตรีม
การดาวน์โหลดไฟล์ด้วยสตรีมช่วยให้คุณประมวลผลข้อมูลขณะที่โหลดได้
วิธีนี้ช่วยให้คุณมีความยืดหยุ่นสูงสุดเมื่อจัดการกับการดาวน์โหลด เรียกใช้ GetStreamAsync()
และส่งตัวประมวลผลสตรีมของคุณเองเป็นอาร์กิวเมนต์แรก
ระบบจะเรียกใช้ตัวรับมอบสิทธิ์นี้ในเธรดเบื้องหลังด้วยสตรีม ซึ่งจะช่วยให้คุณดำเนินการหรือคํานวณที่ทำให้เกิดเวลาในการตอบสนองสูงได้ เช่น จัดเก็บเนื้อหาลงในดิสก์
// 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()
ใช้อาร์กิวเมนต์ที่ไม่บังคับหลังโปรแกรมประมวลผลสตรีม ซึ่งจะช่วยให้คุณยกเลิกการดำเนินการหรือรับการแจ้งเตือนความคืบหน้าได้
ดาวน์โหลดลงในไฟล์ในเครื่อง
วิธี GetFileAsync()
จะดาวน์โหลดไฟล์ไปยังอุปกรณ์ในเครื่องโดยตรง ใช้ตัวเลือกนี้หากผู้ใช้ต้องการเข้าถึงไฟล์ขณะออฟไลน์หรือแชร์ไฟล์ในแอปอื่น
// 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."); } });
คุณสามารถแนบผู้ฟังไว้กับการดาวน์โหลดเพื่อติดตามความคืบหน้าของการดาวน์โหลดได้ ผู้ฟังจะเป็นไปตามSystem.IProgress<T>
อินเทอร์เฟซมาตรฐาน คุณสามารถใช้อินสแตนซ์ของคลาส StorageProgress
เพื่อระบุ Action<T>
ของคุณเองเป็นคอลแบ็กสำหรับเครื่องหมายความคืบหน้า
// 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."); } });
จัดการข้อผิดพลาด
ข้อผิดพลาดที่อาจเกิดขึ้นระหว่างการดาวน์โหลดมีได้หลายสาเหตุ เช่น ไฟล์ไม่อยู่ หรือผู้ใช้ไม่มีสิทธิ์เข้าถึงไฟล์ที่ต้องการ ดูข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาดได้ในส่วนจัดการข้อผิดพลาดของเอกสาร
ขั้นตอนถัดไป
นอกจากนี้ คุณยังรับและอัปเดตข้อมูลเมตาสำหรับไฟล์ที่เก็บไว้ใน Cloud Storage ได้ด้วย