【问题标题】:Uploading Images from UIImage Picker onto new Firebase (Swift)将图像从 UIImage Picker 上传到新的 Firebase (Swift)
【发布时间】:2016-10-13 08:03:55
【问题描述】:

我在我的应用程序中设置了一个 UIImagePicker,它运行良好。选择我的 UIImage 选择器后,我想将个人资料图片上传到 Firebase。这是我选择图片时的功能。

    //image picker did finish code
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {

    let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage
    profilePic.contentMode = .ScaleAspectFill
    profilePic.image = chosenImage
    profilePic.hidden = false
    buttonStack.hidden = true
    changeButtonView.hidden = false
    self.statusLabel.text = "Here is Your Profile Picture"

    dismissViewControllerAnimated(true, completion: nil)


}

新文档指出,我们需要声明一个 NSURl 才能上传文件。这是我尝试查找给定文件的 NSURL,但它不起作用。这是文档及其链接:https://firebase.google.com/docs/storage/ios/upload-files#upload_from_data_in_memory

// File located on disk
let localFile: NSURL = ...
// Create a reference to the file you want to upload
let riversRef = storageRef.child("images/rivers.jpg")

// Upload the file to the path "images/rivers.jpg"
let uploadTask = riversRef.putFile(localFile, metadata: nil) { metadata, error in
  if (error != nil) {
    // Uh-oh, an error occurred!
  } else {
    // Metadata contains file metadata such as size, content-type, and download URL.
    let downloadURL = metadata!.downloadURL
  }
}

这是我检索 UIImagePicker 的 NSURL 的尝试:

//image picker did finish code
    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {

        let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage
        //getting the object's url
        let imageUrl = info[UIImagePickerControllerReferenceURL] as! NSURL
        let imageName = imageUrl.lastPathComponent
        let documentDir = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first! as String;
        let photoUrl = NSURL(fileURLWithPath: documentDir)
        let localPath = photoUrl.URLByAppendingPathComponent(imageName!)
        self.localFile = localPath

        profilePic.contentMode = .ScaleAspectFill
        profilePic.image = chosenImage
        profilePic.hidden = false
        buttonStack.hidden = true
        changeButtonView.hidden = false
        self.statusLabel.text = "Here is Your Profile Picture"

        dismissViewControllerAnimated(true, completion: nil)


    }

我相信如果图像是从相机而不是画廊拍摄的,我也会遇到困难,因为它还没有保存在设备上。如何找到这张图片/快照的 NSURL?

【问题讨论】:

    标签: ios firebase swift2 uiimagepickercontroller firebase-storage


    【解决方案1】:

    这是我从 Firebase 存储上传和下载用户个人资料照片的方法:

        func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {
        userPhoto.image = image
        dismissViewControllerAnimated(true, completion: nil)
        var data = NSData()
        data = UIImageJPEGRepresentation(userPhoto.image!, 0.8)!
        // set upload path
        let filePath = "\(FIRAuth.auth()!.currentUser!.uid)/\("userPhoto")"
        let metaData = FIRStorageMetadata()
        metaData.contentType = "image/jpg"
        self.storageRef.child(filePath).putData(data, metadata: metaData){(metaData,error) in
            if let error = error {
                print(error.localizedDescription)
                return
            }else{
            //store downloadURL
            let downloadURL = metaData!.downloadURL()!.absoluteString
            //store downloadURL at database
        self.databaseRef.child("users").child(FIRAuth.auth()!.currentUser!.uid).updateChildValues(["userPhoto": downloadURL])
            }
    
            }
                       }
    

    我还将图片 URL 存储到 firebase 数据库中,并检查用户是否有个人资料照片,否则您可能会遇到崩溃:

     //get photo back
            
         databaseRef.child("users").child(userID!).observeSingleEventOfType(.Value, withBlock: { (snapshot) in
                // check if user has photo
                if snapshot.hasChild("userPhoto"){
                    // set image locatin
                    let filePath = "\(userID!)/\("userPhoto")"
                    // Assuming a < 10MB file, though you can change that
                    self.storageRef.child(filePath).dataWithMaxSize(10*1024*1024, completion: { (data, error) in
                        
                        let userPhoto = UIImage(data: data!)
                        self.userPhoto.image = userPhoto
                    })
                }
            })
    

    【讨论】:

    • 你也可以这样创建路径:let path = "(NSUUID().uuidString)"
    • @Neen 很棒的建议!谢谢。
    • 上传位效果很好。下载对我不起作用。我必须以不同的方式来做。
    【解决方案2】:

    2020 年简单示例

    1. 不要忘记将 pod 'Firebase/Storage' 添加到您的 podfile 和 pod install

    2. 向您的班级添加两个代表

      class YourScreen: UIViewController, 
        UIImagePickerControllerDelegate, UINavigationControllerDelegate {
      
    3. 故事板、按钮、指向...的链接

      @IBAction func tapCameraButton() {
      let picker = UIImagePickerController()
      picker.allowsEditing = true
      picker.delegate = self
      present(picker, animated: true)
      }
      

      然后

      func imagePickerController(_ picker: UIImagePickerController,
      didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
      
       guard let im: UIImage = info[.editedImage] as? UIImage else { return }
       guard let d: Data = im.jpegData(compressionQuality: 0.5) else { return }
      
       let md = StorageMetadata()
       md.contentType = "image/png"
      
       let ref = Storage.storage().reference().child("someFolder/12345678.jpg")
      
       ref.putData(d, metadata: md) { (metadata, error) in
           if error == nil {
               ref.downloadURL(completion: { (url, error) in
                   print("Done, url is \(String(describing: url))")
               })
           }else{
               print("error \(String(describing: error))")
           }
       }
      
       dismiss(animated: true)
      }
      

    但是你把图片放在哪里?

    在代码处,

    ... .child("someFolder/12345678.jpg")
    

    几乎不可避免,

    • 使用用户 ID、聊天 ID、订阅 ID 或类似概念作为文件夹名称

    • 对于名称,唯一的可能是 uuid

    因此几乎总是

    let f = chatId + "/" + UUID().uuidString + ".jpg"
    let ref = Storage.storage().reference().child(f)
    

    【讨论】:

    • 做得很好。这是我使用的程序。感谢分享。
    • 真的很高兴。处理这种事情真是太烦人了:/而且语法每隔几年就会改变一次。
    【解决方案3】:

    在 Swift 4.2 中工作

    我在这里点击图片,我添加了 tapGesture,然后它打开图库,然后选择上传到 Firebase 的图片,我也添加了 textField 值,我希望它对你有帮助谢谢

    import UIKit
    import Firebase
    class ViewController: UIViewController {
    
        @IBOutlet var myImageView: UIImageView!
        @IBOutlet var txtText: UITextField!
        var ref = DatabaseReference.init()
        var imagePicker = UIImagePickerController()
    
        override func viewDidLoad() {
            super.viewDidLoad()
            self.ref = Database.database().reference()
            let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(ViewController.openGalleryClick(tapGesture:)))
            myImageView.isUserInteractionEnabled = true
            myImageView.addGestureRecognizer(tapGestureRecognizer)
            myImageView.backgroundColor = UIColor.red
        }
    
        @objc func openGalleryClick(tapGesture: UITapGestureRecognizer){
            self.setupImagePicker()
        }
    
        @IBAction func btnSaveClick(_ sender: UIButton) {
             self.saveFIRData()
        }
    
        func saveFIRData(){
            self.uploadMedia(image: myImageView.image!){ url in
                self.saveImage(userName: self.txtText.text!, profileImageURL: url!){ success in
                    if (success != nil){
                        self.dismiss(animated: true, completion: nil)
                    }
    
                }
            }
        }
    
    
        func uploadMedia(image :UIImage, completion: @escaping ((_ url: URL?) -> ())) {
            let storageRef = Storage.storage().reference().child("myimage.png")
            let imgData = self.myImageView.image?.pngData()
            let metaData = StorageMetadata()
            metaData.contentType = "image/png"
            storageRef.putData(imgData!, metadata: metaData) { (metadata, error) in
                if error == nil{
                    storageRef.downloadURL(completion: { (url, error) in
                        completion(url)
                    })
                }else{
                    print("error in save image")
                    completion(nil)
                }
            }
        }
    
        func saveImage(userName:String, profileImageURL: URL , completion: @escaping ((_ url: URL?) -> ())){
            let dict = ["name": "Yogesh", "text": txtText.text!, "profileImageURL": profileImageURL.absoluteString] as [String : Any]
            self.ref.child("chat").childByAutoId().setValue(dict)
        }
    
    }
    
    
    extension ViewController: UINavigationControllerDelegate, UIImagePickerControllerDelegate{
    
        func setupImagePicker(){
            if UIImagePickerController.isSourceTypeAvailable(.savedPhotosAlbum){
                imagePicker.sourceType = .savedPhotosAlbum
                imagePicker.delegate = self
                imagePicker.allowsEditing = true
    
                self.present(imagePicker, animated: true, completion: nil)
            }
        }
    
        func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    
            let image = info[UIImagePickerController.InfoKey.originalImage] as! UIImage
            myImageView.image = image
            picker.dismiss(animated: true, completion: nil)
        }
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 2018-04-09
      • 2016-12-08
      • 1970-01-01
      • 1970-01-01
      • 2017-07-28
      • 2020-07-10
      • 2021-03-18
      • 2018-12-01
      • 2018-12-11
      相关资源
      最近更新 更多