【问题标题】:Retrieving image from Firebase Storage using Swift使用 Swift 从 Firebase 存储中检索图像
【发布时间】:2017-01-16 19:40:46
【问题描述】:

我正在寻找从 Firebase 存储中检索图像的从头到尾的代码示例,只是为了显示图像。作为图像视图或表格。我看过这里的帖子和各种教程。总感觉有些东西被遗漏了。如果我能看到全貌,我就能更好地掌握这一点。

附加的代码是我当前尝试将 photo1 从本地更改为从 Firebase 存储中提取的尝试。

import UIKit
import Firebase
import FirebaseAuth
import FirebaseStorage
import FirebaseDatabase

class MainMenuTableViewController: UITableViewController {



var mainMenu = [Menu]()
var photo1 = UIImage()
override func viewDidLoad() {
    super.viewDidLoad()
    loadMenu()
}

func loadMenu() {

    let storage = FIRStorage.storage()
    // Create a storage reference from the URL
    let storageRef = storage.referenceForURL("https://firebasestorage.googleapis.com/v0/b/medicalpatientapp-7fd45.appspot.com/o/iconimages%2Ffile-medical-icons.png?alt=media&token=c95b9c51-67ae-4e93-b63c-62091015a9ff")
    // Download the data, assuming a max size of 1MB (you can change this as necessary)
    storageRef.dataWithMaxSize(1 * 1024 * 1024) { (data, error) -> Void in
        // Create a UIImage, add it to the array
        let pic = UIImage(data: data!)
        self.photo1 = pic!

    }


   //let photo1 = UIImage(named: "iconimages-file-medical-icons")!
    let menu1 = Menu(name: "My Notes", photo: photo1)!

    let photo2 = UIImage(named: "iconimages-file-medical-icons")!
    let menu2 = Menu(name: "View Patients", photo: photo2)!

    let photo3 = UIImage(named: "iconimages-add-medical-icons")!
    let menu3 = Menu(name: "Add Persons", photo: photo3)!

    mainMenu += [menu1, menu2, menu3]

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return mainMenu.count
}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {


    // Configure the cell...
    let cellIdentifier = "MenuTableViewCell"
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! MainMenuTableViewCell

    // Fetches the appropriate meal for the data source layout.
    let menu = mainMenu[indexPath.row]

    cell.menuLabel.text = menu.name
    cell.menuImage.image = menu.photo

    return cell
}

}

【问题讨论】:

    标签: swift firebase uiimageview firebase-storage


    【解决方案1】:

    我们强烈建议同时使用 Firebase 存储和 Firebase 实时数据库来完成此任务。这是一个完整的例子:

    共享:

    // Firebase services
    var database: FIRDatabase!
    var storage: FIRStorage!
    ...
    // Initialize Database, Auth, Storage
    database = FIRDatabase.database()
    storage = FIRStorage.storage()
    ...
    // Initialize an array for your pictures
    var picArray: [UIImage]()
    

    上传:

    let fileData = NSData() // get data...
    let storageRef = storage.reference().child("myFiles/myFile")
    storageRef.putData(fileData).observeStatus(.Success) { (snapshot) in
      // When the image has successfully uploaded, we get it's download URL
      let downloadURL = snapshot.metadata?.downloadURL()?.absoluteString
      // Write the download URL to the Realtime Database
      let dbRef = database.reference().child("myFiles/myFile")
      dbRef.setValue(downloadURL)
    }
    

    下载:

    let dbRef = database.reference().child("myFiles")
    dbRef.observeEventType(.ChildAdded, withBlock: { (snapshot) in
      // Get download URL from snapshot
      let downloadURL = snapshot.value() as! String
      // Create a storage reference from the URL
      let storageRef = storage.referenceFromURL(downloadURL)
      // Download the data, assuming a max size of 1MB (you can change this as necessary)
      storageRef.dataWithMaxSize(1 * 1024 * 1024) { (data, error) -> Void in
        // Create a UIImage, add it to the array
        let pic = UIImage(data: data)
        picArray.append(pic)
      })
    })
    

    有关详细信息,请参阅Zero to App: Develop with Firebase,它是associated source code,了解如何执行此操作的实际示例。

    【讨论】:

    • 谢谢。对于下载,是从“myfiles”中提取所有内容还是您必须为每个文件都这样做? Firebase 存储可以在没有数据库的情况下单独使用吗?我在之前的帖子中看到过“零到应用程序”,此时我没有使用它来附加到用户个人资料,而且它不像您的示例那么简单。
    • Firebase 存储旨在独立使用。也就是说,通过将它与实时数据库结合使用,列出和检索文件要容易得多。此示例将检索存储在数据库位置“myFiles”中的所有文件,该位置已由上传到“myFiles/{fileName}”填充。
    【解决方案2】:

    我强烈推荐使用内置的 FirebaseUI 函数 sd_setImage。它内置了缓存功能,比使用存储数据库中的数据表示要快得多。

    请务必导入 FirebaseUI 并将其添加到您的 podfile。

    在 Swift 4 中,

    let ref = Database.database().reference()
    let uid = Auth.auth().currentUser?.uid
    let userRef = ref.child("users").child(uid!)
    var myImageView = UIImageView()
    
    userRef.getDocument { (document, error) in
        if let document = document, document.exists {
            let myData = document.data()
            if let profileURL = myData["profileURL"] as? String {
                let storageRef = Storage.storage().reference(forURL: profileURL)
                myImageView.sd_setImage(with: storageRef, placeholderImage: UIImage(named: "placeholder.png"))
            }
            else {
                print("profileURL is nil")
            }
        } 
        else {
            print("Document does not exist")
        }
    }
    

    【讨论】:

      【解决方案3】:

      在 Swift 3 中

          let ref = Database.database().reference()
          let uid = Auth.auth().currentUser?.uid
          let usersRef = ref.child("users").child(uid!)
      
          // only need to fetch once so use single event
          usersRef.observeSingleEvent(of: .value, with: { snapshot in
      
              if !snapshot.exists() { return }
      
              //print(snapshot)
      
              let userInfo = snapshot.value as! NSDictionary
              print(userInfo)
              print(userInfo["name"]!)
              let profileUrl = userInfo["profilePicUrl"] as! String
      
              print(profileUrl)
              let storageRef = Storage.storage().reference(forURL: profileUrl)
              storageRef.downloadURL(completion: { (url, error) in
                  let data = Data(contentsOf: url!)
                  let image = UIImage(data: data! as Data)
                  self.profilePic.image = image
              })
      

      这将从存储中下载图像。

      【讨论】:

        【解决方案4】:

        1. Swift 4.1 仅使用您的应用名称从 Firebase 存储更新规则为您的“STORAGE”左面板 firebase 选项检索图像:-

        service firebase.storage {
          match /b/MyApp-201223.appspot.com/o {
            match /{allPaths=**} {
              // Allow access by all users
              allow read, write;
            }
          }
        }
        

        2。在您导入 firebase 存储的类中创建一个带有回调的简单方法:-

              func downloadImages(folderPath:String,success:@escaping (_ image:UIImage)->(),failure:@escaping (_ error:Error)->()){
                for i in 0 ..< 194{
                    // Create a reference with an initial file path and name
                    let reference = Storage.storage().reference(withPath: "\(folderPath)/0.jpg")
                    reference.getData(maxSize: (1 * 1024 * 1024)) { (data, error) in
                        if let _error = error{
                            print(_error)
                            failure(_error)
                        } else {
                            if let _data  = data {
                                let myImage:UIImage! = UIImage(data: _data)
                                success(myImage)
                            }
                        }
                    }
        
                }
             }
        

        3.随时随地使用此方法:-

              self.downloadImages(folderPath: "MyAppImages", success: { (img) in
                    print(img)
                }) { (error) in
                    print(error)
                }
        

        【讨论】:

          猜你喜欢
          • 2017-01-14
          • 2020-10-23
          • 1970-01-01
          • 2019-09-27
          • 2017-08-30
          • 2017-02-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多