Cloud Storage สำหรับ Firebase ช่วยให้คุณอัปโหลดไฟล์ไปยังที่เก็บข้อมูล Cloud Storage ที่ให้บริการและจัดการโดย Firebase ได้อย่างรวดเร็วและง่ายดาย
สร้างข้อมูลอ้างอิง
หากต้องการอัปโหลดไฟล์ ขั้นแรก ให้สร้างการอ้างอิง Cloud Storage ไปยังตำแหน่งใน Cloud Storage ที่คุณต้องการอัปโหลดไฟล์ไป
คุณสามารถสร้างข้อมูลอ้างอิงได้โดยเพิ่มเส้นทางลูกต่อท้ายรากของที่เก็บข้อมูล Cloud Storage ของคุณ:
// Create a root reference StorageReference storage_ref = storage->GetReference(); // Create a reference to "mountains.jpg" StorageReference mountains_ref = storage_ref.Child("mountains.jpg"); // Create a reference to 'images/mountains.jpg' StorageReference mountain_images_ref = storage_ref.Child("images/mountains.jpg"); // While the file names are the same, the references point to different files mountains_ref.name() == mountain_images_ref.name(); // true mountains_ref.full_path() == mountain_images_ref.full_path(); // false
คุณไม่สามารถอัปโหลดข้อมูลโดยอ้างอิงถึงรากของที่เก็บข้อมูล Cloud Storage ของคุณได้ การอ้างอิงของคุณต้องชี้ไปที่ URL ย่อย
อัพโหลดไฟล์
เมื่อคุณมีข้อมูลอ้างอิงแล้ว คุณจะอัปโหลดไฟล์ไปยัง Cloud Storage ได้ 2 วิธี:
- อัปโหลดจากบัฟเฟอร์ไบต์ในหน่วยความจำ
- อัปโหลดจากเส้นทางไฟล์ที่แสดงไฟล์บนอุปกรณ์
อัพโหลดจากข้อมูลในหน่วยความจำ
เมธอด PutData()
เป็นวิธีที่ง่ายที่สุดในการอัปโหลดไฟล์ไปยัง Cloud Storage PutData()
รับบัฟเฟอร์ไบต์และส่งกลับ Future<Metadata>
ซึ่งจะมีข้อมูลเกี่ยวกับไฟล์เมื่อ Future เสร็จสมบูรณ์ คุณสามารถใช้ Controller
เพื่อจัดการการอัปโหลดและตรวจสอบสถานะได้
// Data in memory const size_t kByteBufferSize = ... uint8_t byte_buffer[kByteBufferSize] = { ... }; // Create a reference to the file you want to upload StorageReference rivers_ref = storage_ref.Child("images/rivers.jpg"); // Upload the file to the path "images/rivers.jpg" Futurefuture = rivers_ref.PutBytes(byte_buffer, kByteBufferSize);
เมื่อถึงจุดที่ทำการร้องขอแล้ว แต่เราต้องรอให้อนาคตเสร็จสิ้นก่อนจึงจะอัพโหลดไฟล์ได้ เนื่องจากโดยทั่วไปแล้วเกมจะทำงานเป็นลูป และมีการเรียกกลับน้อยกว่าแอปพลิเคชันอื่นๆ คุณจึงมักจะสำรวจว่าเล่นจบแล้วหรือไม่
if (future.status() != firebase::kFutureStatusPending) { if (future.status() != firebase::kFutureStatusComplete) { LogMessage("ERROR: GetData() returned an invalid future."); // Handle the error... } else if (future.Error() != firebase::storage::kErrorNone) { LogMessage("ERROR: GetData() returned error %d: %s", future.Error(), future.error_message()); // Handle the error... } } else { // Metadata contains file metadata such as size, content-type, and download URL. Metadata* metadata = future.Result(); std::string download_url = metadata->download_url(); } }
อัปโหลดจากไฟล์ในเครื่อง
คุณสามารถอัพโหลดไฟล์ในเครื่องบนอุปกรณ์ เช่น ภาพถ่ายและวิดีโอจากกล้อง ได้ด้วยวิธี PutFile()
PutFile()
รับ std::string
แทนเส้นทางไปยังไฟล์และส่งกลับ Future<Metadata>
ซึ่งจะมีข้อมูลเกี่ยวกับไฟล์เมื่อ Future เสร็จสมบูรณ์ คุณสามารถใช้ Controller
เพื่อจัดการการอัปโหลดและตรวจสอบสถานะได้
// File located on disk std::string local_file = ... // Create a reference to the file you want to upload StorageReference rivers_ref = storage_ref.Child("images/rivers.jpg"); // Upload the file to the path "images/rivers.jpg" Futurefuture = rivers_ref.PutFile(localFile); // Wait for Future to complete... if (future.Error() != firebase::storage::kErrorNone) { // Uh-oh, an error occurred! } else { // Metadata contains file metadata such as size, content-type, and download URL. Metadata* metadata = future.Result(); std::string download_url = metadata->download_url(); }
หากคุณต้องการจัดการการอัพโหลดของคุณอย่างจริงจัง คุณสามารถจัดหา Controller
ให้กับเมธอด PutFile()
หรือ PutBytes()
ได้ ซึ่งจะทำให้คุณสามารถใช้คอนโทรลเลอร์เพื่อสังเกตการดำเนินการอัปโหลดที่กำลังดำเนินอยู่ได้ ดู จัดการการอัปโหลด สำหรับข้อมูลเพิ่มเติม
เพิ่มข้อมูลเมตาของไฟล์
คุณยังสามารถรวมข้อมูลเมตาเมื่อคุณอัปโหลดไฟล์ได้อีกด้วย ข้อมูลเมตานี้มีคุณสมบัติข้อมูลเมตาของไฟล์ทั่วไป เช่น name
size
และ content_type
(โดยทั่วไปเรียกว่าประเภท MIME) เมธอด PutFile()
จะอนุมานประเภทเนื้อหาจากนามสกุลไฟล์โดยอัตโนมัติ แต่คุณสามารถแทนที่ประเภทที่ตรวจพบอัตโนมัติได้โดยการระบุ content_type
ในข้อมูลเมตา หากคุณไม่ได้ระบุ content_type
และ Cloud Storage ไม่สามารถอนุมานค่าเริ่มต้นจากนามสกุลไฟล์ได้ Cloud Storage จะใช้ application/octet-stream
ดูส่วน ใช้ข้อมูลเมตาของไฟล์ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับข้อมูลเมตาของไฟล์
// Create storage reference StorageReference mountains_ref = storage_ref.Child("images/mountains.jpg"); // Create file metadata including the content type StorageMetadata metadata; metadata.set_content_type("image/jpeg"); // Upload data and metadata mountains_ref.PutBytes(data, metadata); // Upload file and metadata mountains_ref.PutFile(local_file, metadata);
จัดการการอัปโหลด
นอกเหนือจากการเริ่มการอัปโหลดแล้ว คุณสามารถหยุดชั่วคราว ดำเนินการต่อ และยกเลิกการอัปโหลดโดยใช้เมธอด Pause()
, Resume()
และ Cancel()
บน Controller
ซึ่งคุณสามารถเลือกส่งผ่านไปยังเมธอด PutBytes()
หรือ PutFile()
ได้
// Start uploading a file firebase::storage::Controller controller; storage_ref.Child("images/mountains.jpg").PutFile(local_file, nullptr, &controller); // Pause the upload controller.Pause(); // Resume the upload controller.Resume(); // Cancel the upload controller.Cancel();
ติดตามความคืบหน้าการอัปโหลด
คุณสามารถแนบผู้ฟังในการอัปโหลดเพื่อติดตามความคืบหน้าของการอัปโหลด
class MyListener : public firebase::storage::Listener { public: virtual void OnProgress(firebase::storage::Controller* controller) { // A progress event occurred } }; { // Start uploading a file MyEventListener my_listener; storage_ref.Child("images/mountains.jpg").PutFile(local_file, my_listener); }
การจัดการข้อผิดพลาด
มีสาเหตุหลายประการที่ทำให้เกิดข้อผิดพลาดในการอัปโหลด รวมถึงไฟล์ในเครื่องที่ไม่มีอยู่ หรือผู้ใช้ไม่มีสิทธิ์ในการอัปโหลดไฟล์ที่ต้องการ คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาดได้ในส่วน การจัดการข้อผิดพลาด ของเอกสาร
ขั้นตอนถัดไป
เมื่อคุณอัปโหลดไฟล์แล้ว มาดูวิธี ดาวน์โหลดไฟล์ จาก Cloud Storage กันดีกว่า