Cloud Storage for Firebase 讓您可以快速輕鬆地從 Firebase 提供和管理的Cloud Storage 儲存桶下載檔案。
建立參考
若要下載文件,請先建立要下載的文件的 Cloud Storage 引用。
您可以透過將子路徑附加到 Cloud Storage 儲存分區的根來建立引用,也可以從引用 Cloud Storage 中物件的現有gs://
或https://
URL 建立引用。
迅速
// 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 下載檔案:
- 下載到記憶體中的
NSData
- 下載到代表設備上檔案的
NSURL
- 產生一個代表線上文件的
NSURL
下載到記憶體中
使用dataWithMaxSize:completion:
方法將檔案下載到記憶體中的NSData
物件。這是快速下載檔案的最簡單方法,但它必須將檔案的全部內容載入到記憶體中。如果您要求的檔案大於應用程式的可用內存,您的應用程式將崩潰。為了防止記憶體問題,請確保將最大大小設為您知道應用程式可以處理的大小,或使用其他下載方法。
迅速
// 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
,您可以使用它來管理下載並監控上傳狀態。
迅速
// 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,則可以透過呼叫 Cloud Storage 引用上的downloadURLWithCompletion:
方法來取得檔案的下載 URL。
迅速
// 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,您可以透過與SDWebImage的整合快速輕鬆地從雲端儲存下載、快取和顯示影像。
首先,將 FirebaseUI 加入您的Podfile
:
pod 'FirebaseStorageUI'
然後,您可以直接從 Cloud Storage 將映像載入到UIImageView
中:
迅速
// 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
方法來暫停、 resume
和取消下載。這些方法會引發您可以觀察到的pause
、 resume
和cancel
事件。
迅速
// 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
,可用於刪除觀察者。
迅速
// 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 | 此任務來自的參考。 |
您也可以按狀態單獨刪除觀察者,或刪除全部觀察者。
迅速
// 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
後,將刪除所有觀察者。
處理錯誤
下載時出現錯誤的原因有很多,包括文件不存在或使用者沒有存取所需文件的權限。有關錯誤的更多資訊可以在文件的處理錯誤部分找到。
完整範例
下載到本機檔案並進行錯誤處理的完整範例如下所示:
迅速
// 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 中的檔案的元資料。