Cloud Storage for Firebase позволяет быстро и легко загружать файлы из корзины Cloud Storage предоставляемой и управляемой Firebase.
Создать ссылку
Чтобы загрузить файл, сначала создайте ссылку на Cloud Storage для файла, который вы хотите загрузить.
Вы можете создать ссылку, добавив дочерние пути к корню сегмента Cloud Storage , либо создать ссылку на основе существующего URL-адреса gs://
или https://
ссылающегося на объект в Cloud Storage .
Быстрый
// 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")
Цель-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
представляющий файл онлайн.
Загрузить в память
Загрузите файл в объект NSData
в памяти, используя метод dataWithMaxSize:completion:
:. Это самый простой способ быстро загрузить файл, но он должен загружать в память все содержимое вашего файла. Если вы запросите файл, размер которого превышает доступную память вашего приложения, ваше приложение выйдет из строя. Чтобы защититься от проблем с памятью, обязательно установите максимальный размер, который, как вы знаете, может выдержать ваше приложение, или используйте другой метод загрузки.
Быстрый
// 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!) } }
Цель-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 } }
Цель-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 .
Быстрый
// 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' } }
Цель-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
:
Быстрый
// 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)
Цель-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
, которые вы можете наблюдать.
Быстрый
// 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()
Цель-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 }
Цель-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()
Цель-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 } }
Цель-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 .