2016-09-20 4 views
0

Мне было интересно, можно ли получить изображение из базы данных Firebase? Я знаю, что я могу использовать хранилище, но для моей конкретной ситуации его нужно сильно изменить, и было бы намного проще, если бы я мог ввести информацию в дерево JSON и получить его таким образом.Получение изображений из Firebase JSON

Итак, вопрос в том, могу ли я использовать URL-адрес из раздела хранения Firebase и скопировать и вставить его в дочерний элемент в дереве JSON и получить его, как и любой другой номер или строку в базе данных?

Каждый раз, когда я его кодирую, он говорит, что пытается развернуть значение nil, что означает, что он не находит изображение, на которое указывает URL-адрес.

Заранее спасибо. Вот Fetch код, который я использую:

let newsimage1 = cell.viewWithTag(3) as! UIImageView 
let fetch2 = BASE_URL.child("/AA News Feed 1/Image") 
fetch2.observeEventType(.Value, withBlock: { snapshot in 
    let base64EncodedString = snapshot.value 
    let imageData = NSData(base64EncodedString: base64EncodedString as! String, 
       options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters) 
    let decodedImage = UIImage(data:imageData!)! 
    newsimage1.image = decodedImage 
}, withCancelBlock: { error in 
    print(error.description) 
}) 
+0

Дайте ваш код, что вы пробовали. Также FBDB - это база данных реального времени, вы не можете хранить метаданные в FBDB. И да, вы можете это сделать (на самом деле это общий подход, чтобы сохранить путь навигации по хранилищу изображения в базе данных, извлекать его каждый раз, когда вам это нужно./...) – Dravidian

+0

код отправлен ... Мне не нужно сохранять изображения просто нужно получить различные изображения, которые я буду загружать в Firebase – Icculus

+0

Какая строка вызывает ошибку? Вероятно, вы захотите проверить, существует ли изображение с 'snapshot.exists': https://firebase.google.com/docs/reference/ios/firebasedatabase/interface_f_i_r_data_snapshot.html#af14cbacf7ef15cf8c31196bc03e9db09 –

ответ

0

метод вы предложили, как правило, как бы извлечь изображение из Firebase. Вы просто храните URL-адрес в своем FirebaseDatabase, а затем используйте его для получения изображения с FirebaseStorage.

Общие настройки

var storageRootRef: FIRStorageReference! 
var databaseRootRef: FIRDatabaseReference! 

override func viewDidLoad() 
{ 
    super.viewDidLoad() 

    storageRootRef = FIRStorage.storage().reference() 
    databaseRootRef = FIRDatabase.database().reference() 
} 

Image Сохранение

Сначала необходимо сохранить изображение FirebaseStorage затем извлечь downloadURL его местоположение, то только вы можете пойти дальше и написать эту информацию в ваш FirebaseDatabase, как показано ниже

Swift 2

func createUserToDatabase() 
{ 
    storageRootRef = storageRootRef.child("ProfileImages").child(self.currentUser.uid + ".png") 

    if let imageData = UIImagePNGRepresentation(currentUser.profileImage) 
    { 
     storageRootRef.putData(imageData, metadata: nil, completion: { (metadata: FIRStorageMetadata?, error: NSError?) in 

      if let storageError = error 
      { 
       print("Firebase Upload Error") 
       print(storageError.localizedDescription) 
       return 
      } 
      else if let storageMetadata = metadata 
      { 
       if let imageURL = storageMetadata.downloadURL() 
       { 
        self.currentUser.profileImageURL = imageURL.absoluteString 
        // TODO: Now you may write to your Firebase Database since you already have the imageURL stored. 
       } 
      } 
     }) 
    } 
} 

Свифта 3

func createUserToDatabase() 
{ 
    storageRootRef = storageRootRef.child("ProfileImages").child(self.currentUser.uid + ".png") 

    if let imageData = UIImagePNGRepresentation(currentUser.profileImage) 
    { 
     storageRootRef.put(imageData, metadata: nil, completion: { (metadata: FIRStorageMetadata?, error: Error?) in 

      if let storageError = error 
      { 
       print("Firebase Upload Error") 
       print(storageError.localizedDescription) 
       return 
      } 
      else if let storageMetadata = metadata 
      { 
       if let imageURL = storageMetadata.downloadURL() 
       { 
        self.currentUser.profileImageURL = imageURL.absoluteString 
        // TODO: Now you may write to your Firebase Database since you already have the imageURL stored. 
       } 
      } 
     }) 
    } 
} 

Изображение индексирование

Просто запрос в вашу FirebaseDatabase для imageURL, а затем инициировать URLSession для его извлечения, как показано ниже.

Свифта 2

func retrieveUserData() 
{ 
    databaseRootRef!.child("path").observeSingleEventOfType(
    .Value) { (snapshot: FIRDataSnapshot) in 

     if let firebaseValue = snapshot.value 
     { 
      self.currentUser.profileImageURL = firebaseValue["profileImageURL"] as! String 
     } 

     let imageURL: NSURL = NSURL(string: self.currentUser.profileImageURL)! 

     NSURLSession.sharedSession().dataTaskWithURL(imageURL, completionHandler: { (data: NSData?, response: NSURLResponse?, error: NSError?) in 

      if let sessionError = error 
      { 
       print("Error Downloading Image") 
       print(sessionError.localizedDescription) 
      } 
      else if let sessionData = data 
      { 
       dispatch_async(dispatch_get_main_queue(), { 

        self.currentUser.profileImage = UIImage(data: sessionData)! 
       }) 
      } 
     }).resume() 
    } 
} 

Свифта 3

func retrieveUserData() 
{ 
    databaseRootRef!.child("path").observeSingleEvent(
    of: .value) { (snapshot: FIRDataSnapshot) in 

     if let firebaseValue = snapshot.value as? [String:AnyObject] 
     { 
      self.currentUser.profileImageURL = firebaseValue["profileImageURL"] as! String 
     } 

     let imageURL: URL = URL(string: self.currentUser.profileImageURL)! 

     URLSession.shared.dataTask(with: imageURL, completionHandler: { (data: Data?, response: URLResponse?, error: Error?) in 

      if let sessionError = error 
      { 
       print("Error downloading image") 
       print(sessionError.localizedDescription) 
      } 
      else if let sessionData = data 
      { 
       DispatchQueue.main.async(execute: { 
        self.currentUser.profileImage = UIImage(data: sessionData)! 
       }) 
      } 

     }).resume() 
    } 
} 

РЕДАКТИРОВАТЬ

  1. FirebaseStorage нет л onger позволяет добавлять файлы непосредственно в корневой каталог, поэтому рекомендуется создавать каталоги вместо хранения изображений. Для уникальных целей имена ваших изображений могут быть в формате var imageName: String = NSUUID().UUIDString + ".png", или вы могли бы сделать то, что я сделал, что было var imageName: String = userUID + ".png".

  2. Перед загрузкой рекомендуется сначала сжать ваши изображения для более быстрого поиска и поиска.

Смежные вопросы