Загружайте файлы с помощью Cloud Storage на платформах Apple

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 тремя способами:

  1. Загрузить в NSData в память
  2. Загрузите в NSURL представляющий файл на устройстве.
  3. Создайте 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 .