Cloud Storage for Firebase ช่วยให้คุณดาวน์โหลด ไฟล์จาก Cloud Storage บัคเก็ตที่ Firebase จัดหาและจัดการได้อย่างรวดเร็วและง่ายดาย
สร้างการอ้างอิง
หากต้องการดาวน์โหลดไฟล์ ให้สร้างการอ้างอิง ไปยังไฟล์ที่ต้องการดาวน์โหลดก่อนCloud Storage
คุณสร้างการอ้างอิงได้โดยการต่อท้ายเส้นทางย่อยที่รากของ
Cloud Storage Bucket หรือสร้างการอ้างอิงจาก 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."); } });
คุณสามารถแนบ Listener กับการดาวน์โหลดเพื่อตรวจสอบความคืบหน้าของการดาวน์โหลดได้ Listener จะเป็นไปตามอินเทอร์เฟซ System.IProgress<T>
มาตรฐาน คุณสามารถใช้อินสแตนซ์ของคลาส StorageProgress เพื่อระบุ
Action<T> ของคุณเองเป็น Callback สำหรับการอัปเดตความคืบหน้า
// 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ได้ด้วย