Как загружать и просматривать изображения из нового хранилища Firebase?

Я могу загружать изображения в Firebase Storage, но у меня возникают проблемы с их загрузкой. Это мой код для загрузки изображений:

let storage = FIRStorage.storage()
let localURL : NSURL! = NSURL(string: "file:///Documents/co.png")
// i also tried let localURL : NSURL! = NSURL.fileURLWithPath("file:///Documents/co.png")

func download() {
    let storageRef = storage.referenceForURL("gs://project-5547819591027666607.appspot.com")
    let imageRef = storageRef.child("co.png")

    let downloadTask = imageRef.writeToFile(localURL) { (URL, error) -> Void in
        if (error != nil) {
            print(error?.localizedDescription)
        }
        else {
            self.imageView.image = UIImage(data: data!)
        }
    }
}

Я получаю - Необязательно («Произошла неизвестная ошибка, проверьте ответ сервера»)

Также, как только я их загрузю, как мне просмотреть это изображение?

Чтобы узнать, загружено ли изображение, я создал UIImageView и установил для него выход в раскадровке под названием «imageView», а затем установил загруженное изображение в UIImageView.

self.imageView.image = UIImage(data: data!)

person Timmy Sorensen    schedule 08.06.2016    source источник
comment
ваш URL-адрес кажется неправильным для файла. попробуйте fileURLWithString убедиться, что вы можете сначала загрузить изображение с этого URL-адреса в приложение, а затем приступить к загрузке   -  person Shubhank    schedule 08.06.2016
comment
Я пытаюсь скачать   -  person Timmy Sorensen    schedule 08.06.2016
comment
часть о загрузке URL-адреса файла см. здесь. Загрузите URL-адрес, а затем просто используйте этот URL-адрес в Alamofire или NSURLSession самостоятельно. это будет легче сделать, поскольку Alamofire будет делать такие вещи, как кеширование и другие вещи лучше.   -  person Shubhank    schedule 08.06.2016
comment
не могли бы вы показать мне какой-нибудь код в поддержку вашего предложения, пожалуйста   -  person Timmy Sorensen    schedule 08.06.2016
comment
Можете ли вы опубликовать полное сообщение об ошибке (как показано ниже)? Как ни странно, было несколько ошибок разрешений файловой системы, когда у вас фактически нет разрешения на запись в соответствующий каталог.   -  person Mike McDonald    schedule 08.06.2016


Ответы (1)


Пытаться

сначала получить ссылку на изображение, которое вы хотите загрузить, используя

let reference = FIRStorage.storage().reference("uploads/sample.jpg")

Если вы знаете, что размер изображения небольшой - максимум 1-2 Мб. скачать изображение в память

reference.dataWithMaxSize(1 * 1024 * 1024) { (data, error) -> Void in
  if (error != nil) {
    print(error)
  } else {
     let myImage: UIImage! = UIImage(data: data!)    
  }
}

Это будет самый быстрый и простой способ загрузки прямо из Firebase Storage.

Однако бывают случаи, когда вам нужны блоки прогресса и некоторые другие вещи, такие как кеширование. В таких случаях вы можете использовать любую третью сторону, например Alamofire, для загрузки изображения с URL-адреса, полученного от Firebase Storage.
Чтобы получить URL-адрес, выполните следующие действия.

reference.downloadURLWithCompletion { (URL, error) -> Void in
  if (error != nil) {
    // Handle any errors
  } else {
     print(URL)
     // download image using NSURLSession or Alamofire
  }
}
person Shubhank    schedule 08.06.2016
comment
это, похоже, сработало, потому что теперь я получаю «необязательный» (Error Domain = FIRStorageErrorDomain Code = -13021 У пользователя нет разрешения на доступ к gs: //project-*******.appspot.com/ (null). UserInfo = {ResponseBody = {error: {code: 403, message: Developer credentials required.}}, ResponseErrorCode = 403, NSLocalizedDescription = У пользователя нет разрешения на доступ к gs: //project-5547819591027666607.appspot.com/ (null). }) ' - person Timmy Sorensen; 08.06.2016
comment
прочтите о разрешениях firebase.google.com/docs/storage/security/start#overview - person Shubhank; 08.06.2016
comment
Изменение правил безопасности или использование Auth решит проблему, хотя /(null) вызывает беспокойство, поскольку похоже, что вы на самом деле ничего не загружаете (вы пытаетесь загрузить что-то по корневой ссылке?). - person Mike McDonald; 08.06.2016
comment
мою ошибку я скопировал в его строку кода .reference (uploads / sample.jpg) вместо моей ссылки. Сейчас загружается изображение. - person Timmy Sorensen; 08.06.2016
comment
@MikeMcDonald, как мне загрузить все фотографии одновременно? Должен ли я подавать запрос по каждому из них? - person Timmy Sorensen; 08.06.2016
comment
Например, если у меня есть папка с фонами, я загружаю все 10 изображений в таблицу, чтобы пользователь мог выбрать одно. Нужно ли мне отправлять запрос на каждое изображение или я могу запросить папку? - person Timmy Sorensen; 08.06.2016
comment
Вы должны загружать каждую по отдельности, нет концепции пакетной загрузки. - person Mike McDonald; 08.06.2016