【问题标题】:How to store images in firebase storage and save link to them on database?如何将图像存储在 Firebase 存储中并将指向它们的链接保存在数据库中?
【发布时间】:2019-01-29 03:20:48
【问题描述】:

我已经四处寻找答案。我得到的最接近的是here,但是,它并不能完全回答我的问题。也就是说,如何在数据库中存储对保存在 firebase 存储中的图像的引用。

以下是我尝试过的代码。它可以在上传时存储一张图片,但我不确定这是否是他们通过存储参考的意思。

if let imageData = UIImageJPEGRepresentation(image, 0.8) {
    let metadata = storageRef //.child("poop/")

    let uploadTask = metadata.putData(imageData, metadata: nil) {
         (metadata, error) in
        guard let metadata = metadata else {
            // Uh-oh, an error occurred!
            return
        }

        // You can also access to download URL after upload.
        storageRef.downloadURL { 
            (url, error) in
            guard let downloadURL = url else {
                // Uh-oh, an error occurred!
                return
            }
            //let imgURL = url

            //database integration
            let ref = Database.database().reference()
            let usersRef = ref.child("usersPosts")

            let uid = Auth.auth().currentUser?.uid
            let newUserRef = usersRef.child(uid!)
            //creates a child for email and password (i think we shud store password so we can tell sumone what it is inmediatly, maybe)
            newUserRef.setValue(["Image": "\(downloadURL)"])
        }

    }

    //            let imgURL = storageRef.downloadURL
    //
    //            //database integration
    //            let ref = Database.database().reference()
    //            let usersRef = ref.child("usersPosts")
    //
    //            let uid = Auth.auth().currentUser?.uid
    //            let newUserRef = usersRef.child(uid!)
    //            //creates a child for email and password (i think we shud store password so we can tell sumone what it is inmediatly, maybe)
    ////                newUserRef.setValue(["Image": "\(imgURL)"])





    // For progress
    uploadTask.observe(.progress, handler: { (snapshot) in
        guard let progress = snapshot.progress else {
        return
    }

    let percentage = (Float(progress.completedUnitCount) / Float(progress.totalUnitCount))
    progressBlock(Double(percentage))
    })

} else {
    completionBlock(nil, "Image could not be converted to Data.")
}

感谢您的帮助!

【问题讨论】:

    标签: ios swift firebase firebase-realtime-database firebase-storage


    【解决方案1】:

    请根据需要修改您的代码

    var imgData: NSData = NSData(data: UIImageJPEGRepresentation((self.img_Photo?.image)!, 0.8)!)
    self.uploadProfileImageToFirebase(data: imgData)
    
    
    func uploadProfileImageToFirebase(data:NSData){
        let storageRef = Storage.storage().reference().child("usersPosts").child("\(uid).jpg")
        if data != nil {
            storageRef.putData(data as Data, metadata: nil, completion: { (metadata, error) in
                if(error != nil){
                    print(error)
                    return
                }
                guard let userID = Auth.auth().currentUser?.uid else {
                    return
                }
                // Fetch the download URL
                storageRef.downloadURL { url, error in
                    if let error = error {
                        // Handle any errors
                        if(error != nil){
                            print(error)
                            return
                        }
                    } else {
                        // Get the download URL for 'images/stars.jpg'
    
                        let urlStr:String = (url?.absoluteString) ?? ""
                        let values = ["downloadURL": urlStr]
                        self.addImageURLToDatabase(uid: userID, values: values as [String : AnyObject])
                    }
                }
            })
        }
    
    }
    
    
    func addImageURLToDatabase(uid:String, values:[String:AnyObject]){
        let ref = Database.database().reference(fromURL: "https://exampleapp.firebaseio.com/")
        let usersReference = ref.child("usersPosts").child((Auth.auth().currentUser?.uid)!)
    
        usersReference.updateChildValues(values) { (error, ref) in
            if(error != nil){
                print(error)
                return
            }
            self.parentVC?.dismiss(animated: true, completion: nil)
        }
    
    }
    

    【讨论】:

      【解决方案2】:
      (TS)  
      onFileChanged(param){    
      var aa;    
      const file: File = param.target.files[0];  
      const metaData = { 'contentType': file.type };    
      const StorageRef: firebase.storage.Reference = firebase.storage().ref('/photos/Category/'+this.CategoryName);    
      const Store = StorageRef.put(file, metaData);
      setTimeout(() => {
      const UP: firebase.storage.UploadTask = Store;
       UP.snapshot.ref.getDownloadURL().then(function (downloadURL) {
      console.log('File available at', downloadURL);
      aa = downloadURL;
      });
      }, 1000);
      
      setTimeout(() => {
      this.ImageLink = aa;
      debugger;
      }, 2000);
      
      IN HTML
      

      type="file" accept="image/*" #file style="display: none">
      <img (click)="file.click()" style="margin-left: 10%"src="http://icons.iconarchive.com/icons/icons8/windows-8/512/Photo-Video-Stack-Of-Photos-icon.png" width="50px" />
      

      import * as firebase as '@ionic/firebase'

      【讨论】:

      • 您好,欢迎来到 StackOverflow!请为代码提供一些上下文。它有什么作用?为什么它能解决问题?
      • 在 Ionic3 3 中,我们只需将 Storage bucket 添加到 Appmodule.ts 中的 FirebaseAppInitialize() 之后,根据我的文档按照 HTML 、 TS 中的步骤进行操作
      猜你喜欢
      • 2019-05-07
      • 2020-08-09
      • 2018-08-23
      • 2020-04-16
      • 1970-01-01
      • 2021-07-12
      • 2020-12-18
      • 2011-12-28
      • 1970-01-01
      相关资源
      最近更新 更多