将图像存储到登录用户的firebase

Posted

技术标签:

【中文标题】将图像存储到登录用户的firebase【英文标题】:Storing Image to firebase of the logged in user 【发布时间】:2015-09-06 17:18:47 【问题描述】:

这是我的 JSON 结构

用户:

simpleLogin1:

姓名 电子邮件 密码 图片

这就是我创建 ref 和用户的方式:

   var ref = Firebase(url: "https://chatty93.firebaseio.com/")
   var userId = authData.uid

                        let newUser = [
                            "Provider" : authData.provider,
                            "email"    : authData.providerData["email"] as? NSString as? String,
                            "name"     : self.Name.text,
                            "Image"    : "",
                        ]
                   self.ref.childByAppendingPath("users").childByAppendingPath(authData.uid).setValue(newUser)

登录用户在第一个视图控制器上提供的名称电子邮件和密码,然后在另一个视图控制器上用户提供图像。 为此,我在此视图控制器上有一个图像视图,用户将选择它并按下更新按钮以更新他的个人资料的图像,现在我如何将此图像保存在我的 firebase 中,然后检索它以显示它也在任何其他视图控制器上..

【问题讨论】:

因此您希望将图像上传到 JSON 页面 我找到了一种将图像数据编码为 NSstring 并将其保存在 firebase 上的方法,我已经尝试过,我认为图像已保存但现在我该如何检索它? Swift2 retrieving images from Firebase的可能重复 【参考方案1】:

我知道答案。但在我开始解释之前。我们的工具是 Alamofire 3.0、Firebase 2.5、Imageshackapi 和 Imageshack。

我们的应用程序可以发布图像和发布文本。

//
//  Post.swift
//  firebase social network
//
//  Created by durul dalkanat on 1/21/16.
//  Copyright © 2016 durul dalkanat. All rights reserved.

import Foundation

class Post 
    private var _postDescription: String!
    private var _imageUrl: String?
    private var _postKey: String!

    var postDescription: String 
        return _postDescription
    

    var imageUrl: String? 
        return _imageUrl
    



    init(description: String, imageUrl: String?) 
        self._postDescription = description
        self._imageUrl = imageUrl
    

    init(postKey: String, dictionary: Dictionary<String, AnyObject>) 
        self._postKey = postKey

        if let imgUrl = dictionary["imageUrl"] as? String 
            self._imageUrl = imgUrl
        

        if let desc = dictionary["description"] as? String 
            self._postDescription = desc
        
    

让我们编写视图控制器。但是您应该自己配置 customtableviewCell 。

//
//  ViewController.swift
//  firebase social network
//
//  Created by durul dalkanat on 1/21/16.
//  Copyright © 2016 durul dalkanat. All rights reserved.
//

import UIKit
import Firebase
import Alamofire

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UIImagePickerControllerDelegate, UINavigationControllerDelegate 

    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var postField: UITextField!

    @IBOutlet weak var postImg: UIImageView!

    var posts = [Post]()
    var imageSelected = false
    var imagePicker: UIImagePickerController!

    static var imageCache = NSCache()

    override func viewDidLoad() 
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self

        tableView.estimatedRowHeight = 358
        imagePicker = UIImagePickerController()
        imagePicker.delegate = self

        //Sync data with Firebase
        DataService.ds.REF_POSTS.observeEventType(.Value, withBlock:  snapshot in
            print(snapshot.value)

            //Parsing firebase data
            self.posts = []
            if let snapshots = snapshot.children.allObjects as? [FDataSnapshot] 

                for snap in snapshots 

                    if let postDict = snap.value as? Dictionary<String, AnyObject> 
                        let key = snap.key
                        let post = Post(postKey: key, dictionary: postDict)
                        self.posts.append(post)
                    

                

            

            self.tableView.reloadData()
        )

    

    func numberOfSectionsInTableView(tableView: UITableView) -> Int 
        return 1
    

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return posts.count
    

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

        let post = posts[indexPath.row]

        if let cell = tableView.dequeueReusableCellWithIdentifier("PostCell") as? PostCell 

            cell.request?.cancel()

            var img: UIImage?

            if let url = post.imageUrl 
                img = ViewController.imageCache.objectForKey(url) as? UIImage
            

            cell.configureCell(post, img: img)

            return cell
         else 
            return PostCell()
        
    

    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 

        let post = posts[indexPath.row]

        if post.imageUrl == nil 
            return 150
         else 
            return tableView.estimatedRowHeight
        
    


    @IBAction func selectImage(sender: UITapGestureRecognizer) 
        presentViewController(imagePicker, animated: true, completion: nil)
    

    @IBAction func makePost(sender: AnyObject) 

        if let txt = postField.text where txt != "" 

            if let img = postImg.image 
                let urlStr = "https://post.imageshack.us/upload_api.php"
                let url = NSURL(string: urlStr)!

                //compression quality.
                let imgData = UIImageJPEGRepresentation(img, 0.2)!

                //Converting data from strings
                let keyData = "You should write own api number here".dataUsingEncoding(NSUTF8StringEncoding)!

                //Converting data from json
                let keyJSON = "json".dataUsingEncoding(NSUTF8StringEncoding)!


                Alamofire.upload(.POST, url, multipartFormData:  multipartFormData in

                    //Check this documentaion https://code.google.com/p/imageshackapi/wiki/ImageshackAPI
                    multipartFormData.appendBodyPart(data: imgData, name:"fileupload", fileName:"image", mimeType: "image/jpg")
                    multipartFormData.appendBodyPart(data: keyData, name: "key")
                    multipartFormData.appendBodyPart(data: keyJSON, name: "format")

                    )  encodingResult in

                        switch encodingResult 

                        case .Success(let upload, _, _):
                            upload.responseJSON(completionHandler:  response in

                                let result = response.result
                                print(result.value?.debugDescription)

                                if let info = result.value as? Dictionary<String, AnyObject> 

                                    if let links = info["links"] as? Dictionary<String, AnyObject> 
                                        print(links)
                                        if let imgLink = links["image_link"] as? String 
                                            self.postToFirebase(imgLink)
                                        
                                    
                                
                            )

                        case .Failure(let error):
                            print(error)
                            //Maybe show alert to user and let them try again
                        
                
             else 
                postToFirebase(nil)
            


        

    

    //Saving Posts to Firebase
    func postToFirebase(imgUrl: String?) 

        var post: Dictionary<String, AnyObject> = [
            "description":postField.text!     
   ]

        if imgUrl != nil 
            post["imageUrl"] = imgUrl!
        

        //Save new post to firebase
        let fbPost = DataService.ds.REF_POSTS.childByAutoId()
        fbPost.setValue(post)

        //Clear out fields
        self.postField.text = ""
        self.postImg.image = UIImage(named: "camera")

        tableView.reloadData()
    

    func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) 
        imagePicker.dismissViewControllerAnimated(true, completion: nil)
        postImg.image = image
        imageSelected = true

    

我希望,这个代码块会帮助你。但不要忘记测试数据不能立即更新。

这是我的计划。

【讨论】:

以上是关于将图像存储到登录用户的firebase的主要内容,如果未能解决你的问题,请参考以下文章

Flutter将图像上传到firebase存储然后将其写入firestore

将一个用户的图像上传到 Firebase 存储时,数据库中每个用户的图像链接都会更新

将图片存储在 cookie 中

如何在将照片上传到 Firebase 存储时将日期或时间等用户图像详细信息添加到文件名?

将用户登录-注销时间存储到数据库中有所不同

将图像上传到存储并更新配置文件