将图像存储到登录用户的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 存储时,数据库中每个用户的图像链接都会更新