Cloud Storage for Firebase ช่วยให้คุณดาวน์โหลดไฟล์จากที่เก็บข้อมูล Cloud Storage ที่ Firebase จัดหาและจัดการได้อย่างรวดเร็วและง่ายดาย
สร้างการอ้างอิง
หากต้องการดาวน์โหลดไฟล์ ก่อนอื่น ให้สร้างCloud Storageการอ้างอิงสำหรับไฟล์ที่ต้องการดาวน์โหลด
คุณสามารถสร้างการอ้างอิงได้โดยเพิ่มเส้นทางย่อยต่อท้ายรูทของที่เก็บข้อมูล Cloud Storage หรือจะสร้างการอ้างอิงจาก URL gs://
หรือ https://
ที่มีอยู่ซึ่งอ้างอิงถึงออบเจ็กต์ใน Cloud Storage ก็ได้
Swift
// Create a reference with an initial file path and name let pathReference = storage.reference(withPath: "images/stars.jpg") // Create a reference from a Google Cloud Storage URI let gsReference = storage.reference(forURL: "gs://<your-firebase-storage-bucket>/images/stars.jpg") // Create a reference from an HTTPS URL // Note that in the URL, characters are URL escaped! let httpsReference = storage.reference(forURL: "https://firebasestorage.googleapis.com/b/bucket/o/images%20stars.jpg")
Objective-C
// Create a reference with an initial file path and name FIRStorageReference *pathReference = [storage referenceWithPath:@"images/stars.jpg"]; // Create a reference from a Google Cloud Storage URI FIRStorageReference *gsReference = [storage referenceForURL:@"gs://<your-firebase-storage-bucket>/images/stars.jpg"]; // Create a reference from an HTTPS URL // Note that in the URL, characters are URL escaped! FIRStorageReference *httpsReference = [storage referenceForURL:@"https://firebasestorage.googleapis.com/b/bucket/o/images%20stars.jpg"];
ดาวน์โหลดไฟล์
เมื่อมีข้อมูลอ้างอิงแล้ว คุณจะดาวน์โหลดไฟล์จาก Cloud Storage ได้ 3 วิธีดังนี้
- ดาวน์โหลดไปยัง
NSData
ในหน่วยความจำ - ดาวน์โหลดเป็น
NSURL
ที่แสดงถึงไฟล์ในอุปกรณ์ - สร้าง
NSURL
ที่แสดงไฟล์บนโลกออนไลน์
ดาวน์โหลดในหน่วยความจำ
ดาวน์โหลดไฟล์ไปยังออบเจ็กต์ NSData
ในหน่วยความจําโดยใช้เมธอด
dataWithMaxSize:completion:
วิธีนี้เป็นวิธีที่ง่ายที่สุดในการดาวน์โหลดไฟล์อย่างรวดเร็ว แต่จะต้องโหลดเนื้อหาทั้งหมดของไฟล์ลงในหน่วยความจำ
หากคุณขอไฟล์ที่มีขนาดใหญ่กว่าหน่วยความจำที่พร้อมใช้งานของแอป แอปจะขัดข้อง เพื่อป้องกันปัญหาเกี่ยวกับหน่วยความจำ อย่าลืมตั้งค่าขนาดสูงสุดเป็นขนาดที่คุณทราบว่าแอปสามารถจัดการได้ หรือใช้วิธีการดาวน์โหลดอื่น
Swift
// Create a reference to the file you want to download let islandRef = storageRef.child("images/island.jpg") // Download in memory with a maximum allowed size of 1MB (1 * 1024 * 1024 bytes) islandRef.getData(maxSize: 1 * 1024 * 1024) { data, error in if let error = error { // Uh-oh, an error occurred! } else { // Data for "images/island.jpg" is returned let image = UIImage(data: data!) } }
Objective-C
// Create a reference to the file you want to download FIRStorageReference *islandRef = [storageRef child:@"images/island.jpg"]; // Download in memory with a maximum allowed size of 1MB (1 * 1024 * 1024 bytes) [islandRef dataWithMaxSize:1 * 1024 * 1024 completion:^(NSData *data, NSError *error){ if (error != nil) { // Uh-oh, an error occurred! } else { // Data for "images/island.jpg" is returned UIImage *islandImage = [UIImage imageWithData:data]; } }];
ดาวน์โหลดลงในไฟล์ในเครื่อง
เมธอด writeToFile:completion:
จะดาวน์โหลดไฟล์ลงในอุปกรณ์ในเครื่องโดยตรง ใช้คำสั่งนี้หากผู้ใช้ต้องการเข้าถึงไฟล์ขณะออฟไลน์หรือแชร์ในแอปอื่น writeToFile:completion:
จะแสดงFIRStorageDownloadTask
ซึ่งคุณใช้เพื่อจัดการการดาวน์โหลดและตรวจสอบสถานะการอัปโหลดได้
Swift
// Create a reference to the file you want to download let islandRef = storageRef.child("images/island.jpg") // Create local filesystem URL let localURL = URL(string: "path/to/image")! // Download to the local filesystem let downloadTask = islandRef.write(toFile: localURL) { url, error in if let error = error { // Uh-oh, an error occurred! } else { // Local file URL for "images/island.jpg" is returned } }
Objective-C
// Create a reference to the file you want to download FIRStorageReference *islandRef = [storageRef child:@"images/island.jpg"]; // Create local filesystem URL NSURL *localURL = [NSURL URLWithString:@"path/to/image"]; // Download to the local filesystem FIRStorageDownloadTask *downloadTask = [islandRef writeToFile:localURL completion:^(NSURL *URL, NSError *error){ if (error != nil) { // Uh-oh, an error occurred! } else { // Local file URL for "images/island.jpg" is returned } }];
หากคุณต้องการจัดการการดาวน์โหลดอย่างต่อเนื่อง ให้ใช้เมธอด writeToFile:
และสังเกตงานการดาวน์โหลดแทนที่จะใช้ตัวแฮนเดิลการเสร็จสมบูรณ์
โปรดดูข้อมูลเพิ่มเติมที่หัวข้อจัดการการดาวน์โหลด
สร้าง URL การดาวน์โหลด
หากมีโครงสร้างพื้นฐานการดาวน์โหลดที่อิงตาม URL อยู่แล้ว หรือเพียงแค่ต้องการ URL ที่จะแชร์ คุณก็รับ URL การดาวน์โหลดของไฟล์ได้โดยเรียกใช้เมธอด downloadURLWithCompletion:
ในข้อมูลอ้างอิง Cloud Storage
Swift
// Create a reference to the file you want to download let starsRef = storageRef.child("images/stars.jpg") // Fetch the download URL starsRef.downloadURL { url, error in if let error = error { // Handle any errors } else { // Get the download URL for 'images/stars.jpg' } }
Objective-C
// Create a reference to the file you want to download FIRStorageReference *starsRef = [storageRef child:@"images/stars.jpg"]; // Fetch the download URL [starsRef downloadURLWithCompletion:^(NSURL *URL, NSError *error){ if (error != nil) { // Handle any errors } else { // Get the download URL for 'images/stars.jpg' } }];
การดาวน์โหลดรูปภาพด้วย FirebaseUI
FirebaseUI มีการเชื่อมโยงบนอุปกรณ์เคลื่อนที่แบบเนทีฟที่เรียบง่าย ปรับแต่งได้ และพร้อมใช้งานจริงเพื่อขจัดโค้ดที่ซ้ำกันและใช้แนวทางปฏิบัติแนะนำของ Google เมื่อใช้ FirebaseUI คุณจะดาวน์โหลด แคช และแสดงรูปภาพจาก Cloud Storage ได้อย่างรวดเร็วและง่ายดายโดยใช้การผสานรวมกับ SDWebImage
ก่อนอื่น ให้เพิ่ม FirebaseUI ลงในPodfile
pod 'FirebaseStorageUI'
จากนั้นคุณสามารถโหลดรูปภาพจาก Cloud Storage ไปยัง UIImageView
ได้โดยตรง ดังนี้
Swift
// Reference to an image file in Firebase Storage let reference = storageRef.child("images/stars.jpg") // UIImageView in your ViewController let imageView: UIImageView = self.imageView // Placeholder image let placeholderImage = UIImage(named: "placeholder.jpg") // Load the image using SDWebImage imageView.sd_setImage(with: reference, placeholderImage: placeholderImage)
Objective-C
// Reference to an image file in Firebase Storage FIRStorageReference *reference = [storageRef child:@"images/stars.jpg"]; // UIImageView in your ViewController UIImageView *imageView = self.imageView; // Placeholder image UIImage *placeholderImage; // Load the image using SDWebImage [imageView sd_setImageWithStorageReference:reference placeholderImage:placeholderImage];
จัดการการดาวน์โหลด
นอกจากการเริ่มดาวน์โหลดแล้ว คุณยังหยุดชั่วคราว ดาวน์โหลดต่อ และยกเลิกการดาวน์โหลดได้โดยใช้ปุ่ม pause
, resume
และ cancel
วิธีการเหล่านี้จะเพิ่มจำนวนเหตุการณ์ pause
, resume
และ cancel
ที่คุณสังเกตได้
Swift
// Start downloading a file let downloadTask = storageRef.child("images/mountains.jpg").write(toFile: localFile) // Pause the download downloadTask.pause() // Resume the download downloadTask.resume() // Cancel the download downloadTask.cancel()
Objective-C
// Start downloading a file FIRStorageDownloadTask *downloadTask = [[storageRef child:@"images/mountains.jpg"] writeToFile:localFile]; // Pause the download [downloadTask pause]; // Resume the download [downloadTask resume]; // Cancel the download [downloadTask cancel];
ตรวจสอบความคืบหน้าในการดาวน์โหลด
คุณสามารถแนบผู้สังเกตการณ์กับ FIRStorageDownloadTask
เพื่อติดตามความคืบหน้าของการดาวน์โหลดได้ การเพิ่มผู้สังเกตการณ์จะแสดงผล FIRStorageHandle
ซึ่งสามารถใช้เพื่อนำผู้สังเกตการณ์ออก
Swift
// Add a progress observer to a download task let observer = downloadTask.observe(.progress) { snapshot in // A progress event occurred }
Objective-C
// Add a progress observer to a download task FIRStorageHandle observer = [downloadTask observeStatus:FIRStorageTaskStatusProgress handler:^(FIRStorageTaskSnapshot *snapshot) { // A progress event occurred }];
ผู้สังเกตการณ์เหล่านี้สามารถลงทะเบียนกับเหตุการณ์ FIRStorageTaskStatus
ได้
เหตุการณ์ `FIRStorageTaskStatus` | การใช้งานทั่วไป |
---|---|
FIRStorageTaskStatusResume |
เหตุการณ์นี้จะเริ่มทำงานเมื่องานเริ่มหรือดาวน์โหลดต่อ และมักจะใช้ร่วมกับเหตุการณ์ FIRStorageTaskStatusPause |
FIRStorageTaskStatusProgress |
เหตุการณ์นี้จะทริกเกอร์ทุกครั้งที่มีการดาวน์โหลดข้อมูลจาก Cloud Storage และสามารถใช้เพื่อแสดงตัวบ่งชี้ความคืบหน้าในการดาวน์โหลด |
FIRStorageTaskStatusPause |
เหตุการณ์นี้จะทริกเกอร์ทุกครั้งที่มีการหยุดการดาวน์โหลดชั่วคราว และมักใช้ร่วมกับเหตุการณ์ FIRStorageTaskStatusResume |
FIRStorageTaskStatusSuccess |
เหตุการณ์นี้จะทริกเกอร์เมื่อการดาวน์โหลดเสร็จสมบูรณ์ |
FIRStorageTaskStatusFailure |
เหตุการณ์นี้จะเริ่มทำงานเมื่อดาวน์โหลดไม่สำเร็จ ตรวจสอบข้อผิดพลาดเพื่อหาสาเหตุของความล้มเหลว |
เมื่อเกิดเหตุการณ์ ระบบจะส่งออบเจ็กต์ FIRStorageTaskSnapshot
กลับ ภาพรวมนี้เป็นการดูงานที่แก้ไขไม่ได้ ณ เวลาที่เกิดเหตุการณ์
ออบเจ็กต์นี้มีพร็อพเพอร์ตี้ต่อไปนี้
พร็อพเพอร์ตี้ | ประเภท | คำอธิบาย |
---|---|---|
progress |
NSProgress |
ออบเจ็กต์ NSProgress ที่มีความคืบหน้าในการดาวน์โหลด |
error |
NSError |
เกิดข้อผิดพลาดระหว่างการดาวน์โหลด (หากมี) |
metadata |
FIRStorageMetadata |
nil สำหรับการดาวน์โหลด |
task |
FIRStorageDownloadTask |
งานที่เป็นภาพรวมนี้ ซึ่งสามารถใช้เพื่อจัดการ (pause , resume , cancel ) งาน |
reference |
FIRStorageReference |
ข้อมูลอ้างอิงที่มาของงาน |
นอกจากนี้ คุณยังนำผู้สังเกตการณ์ออกทีละคน ตามสถานะ หรือนำออกทั้งหมดได้ด้วย
Swift
// Create a task listener handle let observer = downloadTask.observe(.progress) { snapshot in // A progress event occurred } // Remove an individual observer downloadTask.removeObserver(withHandle: observer) // Remove all observers of a particular status downloadTask.removeAllObservers(for: .progress) // Remove all observers downloadTask.removeAllObservers()
Objective-C
// Create a task listener handle FIRStorageHandle observer = [downloadTask observeStatus:FIRStorageTaskStatusProgress handler:^(FIRStorageTaskSnapshot *snapshot) { // A progress event occurred }]; // Remove an individual observer [downloadTask removeObserverWithHandle:observer]; // Remove all observers of a particular status [downloadTask removeAllObserversForStatus:FIRStorageTaskStatusProgress]; // Remove all observers [downloadTask removeAllObservers];
ระบบจะนำผู้สังเกตการณ์ทั้งหมดออกหลังจากเกิด FIRStorageTaskStatusSuccess
หรือ FIRStorageTaskStatusFailure
เพื่อป้องกันไม่ให้หน่วยความจำรั่วไหล
จัดการข้อผิดพลาด
การเกิดข้อผิดพลาดขึ้นขณะดาวน์โหลดมีสาเหตุหลายประการ ได้แก่ การที่ไฟล์ไม่มีอยู่ หรือผู้ใช้ไม่มีสิทธิ์เข้าถึงไฟล์ที่ต้องการ ดูข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาดได้ในส่วนจัดการข้อผิดพลาดของเอกสาร
ตัวอย่างแบบเต็ม
ตัวอย่างการดาวน์โหลดไปยังไฟล์ในเครื่องแบบเต็มพร้อมการจัดการข้อผิดพลาดแสดงอยู่ด้านล่าง
Swift
// Create a reference to the file we want to download let starsRef = storageRef.child("images/stars.jpg") // Start the download (in this case writing to a file) let downloadTask = storageRef.write(toFile: localURL) // Observe changes in status downloadTask.observe(.resume) { snapshot in // Download resumed, also fires when the download starts } downloadTask.observe(.pause) { snapshot in // Download paused } downloadTask.observe(.progress) { snapshot in // Download reported progress let percentComplete = 100.0 * Double(snapshot.progress!.completedUnitCount) / Double(snapshot.progress!.totalUnitCount) } downloadTask.observe(.success) { snapshot in // Download completed successfully } // Errors only occur in the "Failure" case downloadTask.observe(.failure) { snapshot in guard let errorCode = (snapshot.error as? NSError)?.code else { return } guard let error = StorageErrorCode(rawValue: errorCode) else { return } switch (error) { case .objectNotFound: // File doesn't exist break case .unauthorized: // User doesn't have permission to access file break case .cancelled: // User cancelled the download break /* ... */ case .unknown: // Unknown error occurred, inspect the server response break default: // Another error occurred. This is a good place to retry the download. break } }
Objective-C
// Create a reference to the file we want to download FIRStorageReference *starsRef = [storageRef child:@"images/stars.jpg"]; // Start the download (in this case writing to a file) FIRStorageDownloadTask *downloadTask = [storageRef writeToFile:localURL]; // Observe changes in status [downloadTask observeStatus:FIRStorageTaskStatusResume handler:^(FIRStorageTaskSnapshot *snapshot) { // Download resumed, also fires when the download starts }]; [downloadTask observeStatus:FIRStorageTaskStatusPause handler:^(FIRStorageTaskSnapshot *snapshot) { // Download paused }]; [downloadTask observeStatus:FIRStorageTaskStatusProgress handler:^(FIRStorageTaskSnapshot *snapshot) { // Download reported progress double percentComplete = 100.0 * (snapshot.progress.completedUnitCount) / (snapshot.progress.totalUnitCount); }]; [downloadTask observeStatus:FIRStorageTaskStatusSuccess handler:^(FIRStorageTaskSnapshot *snapshot) { // Download completed successfully }]; // Errors only occur in the "Failure" case [downloadTask observeStatus:FIRStorageTaskStatusFailure handler:^(FIRStorageTaskSnapshot *snapshot) { if (snapshot.error != nil) { switch (snapshot.error.code) { case FIRStorageErrorCodeObjectNotFound: // File doesn't exist break; case FIRStorageErrorCodeUnauthorized: // User doesn't have permission to access file break; case FIRStorageErrorCodeCancelled: // User canceled the upload break; /* ... */ case FIRStorageErrorCodeUnknown: // Unknown error occurred, inspect the server response break; } } }];
นอกจากนี้ คุณยังรับและอัปเดตข้อมูลเมตาสำหรับไฟล์ที่เก็บไว้ใน Cloud Storage ได้ด้วย