ดาวน์โหลดไฟล์ด้วย Cloud Storage for Unity

Cloud Storage สำหรับ Firebase ช่วยให้คุณดาวน์โหลดไฟล์จากที่เก็บ ข้อมูล Cloud Storage ที่ Firebase จัดเตรียมและจัดการโดย Firebase ได้อย่างรวดเร็วและง่ายดาย

สร้างข้อมูลอ้างอิง

หากต้องการดาวน์โหลดไฟล์ ขั้นแรก ให้สร้างการอ้างอิง Cloud Storage ไปยังไฟล์ที่คุณต้องการดาวน์โหลด

คุณสามารถสร้างข้อมูลอ้างอิงได้โดยเพิ่มเส้นทางลูกต่อท้ายรากของที่เก็บข้อมูล Cloud Storage ของคุณ หรือคุณสามารถสร้างข้อมูลอ้างอิงจาก gs:// หรือ https:// URL ที่มีอยู่ซึ่งอ้างอิงออบเจ็กต์ใน 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 วิธี:

  1. ดาวน์โหลดจาก URL
  2. ดาวน์โหลดไปยังอาร์เรย์ไบต์
  3. ดาวน์โหลดด้วยสตรีม
  4. ดาวน์โหลดเป็นไฟล์ในเครื่อง

วิธีที่คุณจะใช้เพื่อเรียกค้นไฟล์ของคุณจะขึ้นอยู่กับวิธีที่คุณต้องการใช้ข้อมูลในเกมของคุณ

ดาวน์โหลดจาก URL

หากคุณต้องการใช้ URL กับ WWW ของ Unity หรือ UnityWebRequest คุณสามารถรับ 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 เป็นไปตามอินเทอร์เฟซ 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 ได้ด้วย