Ios 将图像和帖子上载到Firebase 5数据库时出现问题
我目前正试图上传一个照片URL,并在firebase数据库中发布标题。照片目前保存在firebase存储中,这很好,但是我希望它也出现在firebase数据库中。 我反复发现自己正在处理这个错误“类型为'StorageMetadata'的值没有成员'downloadURL'” 我知道在firebase 5中,要从存储中获取url,需要调用存储引用上的downloadURL,而不是元数据。我尝试了多种方法和示例,但都会导致错误Ios 将图像和帖子上载到Firebase 5数据库时出现问题,ios,firebase,firebase-realtime-database,swift4,Ios,Firebase,Firebase Realtime Database,Swift4,我目前正试图上传一个照片URL,并在firebase数据库中发布标题。照片目前保存在firebase存储中,这很好,但是我希望它也出现在firebase数据库中。 我反复发现自己正在处理这个错误“类型为'StorageMetadata'的值没有成员'downloadURL'” 我知道在firebase 5中,要从存储中获取url,需要调用存储引用上的downloadURL,而不是元数据。我尝试了多种方法和示例,但都会导致错误 @ibvar照片:UIImageView! @IBOutlet弱var
@ibvar照片:UIImageView!
@IBOutlet弱var captionTextView:UITextView!
@iBButtonItem:iBButtonItem!
@IBVAR弱共享按钮:UIButton!
var selectedImage:UIImage?
重写func viewDidLoad(){
super.viewDidLoad()
让TapSirture=UITapSirture识别器(目标:self,操作:#选择器(self.handleSelectPhoto));photo.AddGestureRecognitor(TapSirture)
photo.isUserInteractionEnabled=true
}
覆盖函数视图将出现(uo动画:Bool){
超级。视图将显示(动画)
handlePost()
}
func handlePost(){
如果选择了图像!=nil{
self.shareButton.isEnabled=true
self.removeButton.isEnabled=true
self.shareButton.backgroundColor=UIColor(红色:0,绿色:0,蓝色:0,alpha:1)
}否则{
self.shareButton.isEnabled=false
self.shareButton.backgroundColor=.lightGray
self.removeButton.isEnabled=false
}
}
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
view.endEditing(真)
}
@objc func handleSelectPhoto(){
让pickerController=UIImagePickerController()
pickerController.delegate=self
当前(pickerController,动画:真,完成:无)
}
@iAction func shareButton_TouchUpInside(u发件人:任意){
view.endEditing(真)
让hud=JGProgressHUD(样式:。暗)
hud.textlab.text=“正在加载”
hud.show(在:self.view中)
平显关闭(后延迟:3.0)
如果让profileImg=self.selectedImage,则让imageData=UIImageJPEGresentation(profileImg,0.1){
让photoIdString=nsuid().uuidString
让storageRef=Storage.Storage().reference(forURL:“…”).child(“posts”).child(photoIdString)
storageRef.putData(imageData,元数据:nil,完成:{(元数据,错误)在
如果错误!=nil{
返回
}
//让photoUrl=url?.absoluteString
让photoUrl=元数据?.downloadURL()?.absoluteString
self.sendDataToDatabase(photoUrl:photoUrl!)
}
)}
}
@iAction func remove_TouchUpInside(u发送方:任意){
干净的
handlePost()
}
func sendDataToDatabase(photoUrl:String){
设ref=Database.Database().reference()
让postsReference=ref.child(“posts”)
让newPostId=postsReference.childByAutoId().key
让newPostReference=postsReference.child(newPostId)
newPostReference.setValue([“photoUrl”:photoUrl,“caption”:captionTextView.text!],withCompletionBlock:{
(错误,参考)在
如果错误!=nil{
ProgressHUD.淋浴错误(错误!.localizedDescription)
返回
}
ProgressHUD.showSuccess(“成功”)
self.clean()
self.tabbar控制器?.selectedIndex=0//将用户切换回所选tabbar 0=first 1=second等。
})
}
func clean(){
self.captionTextView.text=“”
self.photo.image=UIImage(命名为:“占位符照片”)
self.selectedImage=nil
}
}
扩展摄像机控制器:UIImagePickerController远程门,
UINavigationControllerDelegate{
func imagePickerController(picker:UIImagePickerController,
didFinishPickingMediaWithInfo:[字符串:任意]){
打印(“已完成介质拾取”)
如果let image=info[“UIImagePickerControllerOriginalImage”]
as?UIImage{
选择图像=图像
图片
}
//profileImage.image=infoPhoto
驳回(动画:真,完成:无)
}
}
导入UIKit
导入进度HUD
导入FirebaseStorage
导入FirebaseDatabase
类CameraViewController:UIViewController{
@IBVAR照片:UIImageView!
@IBVAR弱共享按钮:UIButton!
@IBOutlet弱var captionTextView:UITextView!
@iBButtonItem:iBButtonItem!
var selectedImage:UIImage?
重写func viewDidLoad(){
super.viewDidLoad()
让Tap手势=UITapGestureRecognitor(目标:self,动作:#选择器(self.handleSelectPhoto))
照片.AddGestureRecognitor(点击手势)
photo.isUserInteractionEnabled=true
}
覆盖函数视图将出现(uo动画:Bool){
超级。视图将显示(动画)
handlePost()
}
func handlePost(){
如果选择了图像!=nil{
self.shareButton.isEnabled=true
self.removeButton.isEnabled=true
self.shareButton.backgroundColor=UIColor(红色:0,绿色:0,蓝色:0,alpha:1)
}否则{
self.shareButton.isEnabled=false
self.removeButton.isEnabled=false
self.shareButton.backgroundColor=.lightGray
}
}
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
view.endEditing(真)
}
@objc func handleSelectPhoto(){
让pickerController=UIImagePickerController()
pickerController.delegate=self
当前(pickerController,动画:真,完成:无)
}
//将照片共享到存储数据库
@iAction func shareButton_TouchUpInside(u发件人:任意){
view.endEditing(真)
ProgressHUD.show(“请稍候…”,交互:false)
如果让profileImg=self.selectedImage,则让photoData=profileImg.jpegData(压缩质量:0.1){
让photoIdStr
@IBOutlet weak var photo: UIImageView!
@IBOutlet weak var captionTextView: UITextView!
@IBOutlet weak var removeButton: UIBarButtonItem!
@IBOutlet weak var shareButton: UIButton!
var selectedImage: UIImage?
override func viewDidLoad() {
super.viewDidLoad()
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.handleSelectPhoto)); photo.addGestureRecognizer(tapGesture)
photo.isUserInteractionEnabled = true
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
handlePost()
}
func handlePost() {
if selectedImage != nil {
self.shareButton.isEnabled = true
self.removeButton.isEnabled = true
self.shareButton.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 1)
}else{
self.shareButton.isEnabled = false
self.shareButton.backgroundColor = .lightGray
self.removeButton.isEnabled = false
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
view.endEditing(true)
}
@objc func handleSelectPhoto() {
let pickerController = UIImagePickerController()
pickerController.delegate = self
present(pickerController, animated: true, completion: nil)
}
@IBAction func shareButton_TouchUpInside(_ sender: Any) {
view.endEditing(true)
let hud = JGProgressHUD(style: .dark)
hud.textLabel.text = "Loading"
hud.show(in: self.view)
hud.dismiss(afterDelay: 3.0)
if let profileImg = self.selectedImage, let imageData = UIImageJPEGRepresentation(profileImg, 0.1) {
let photoIdString = NSUUID().uuidString
let storageRef = Storage.storage().reference(forURL: ".......").child("posts").child(photoIdString)
storageRef.putData(imageData, metadata: nil, completion: { (metadata, error) in
if error != nil {
return
}
//let photoUrl = url?.absoluteString
let photoUrl = metadata?.downloadURL()?.absoluteString
self.sendDataToDatabase(photoUrl: photoUrl!)
}
)}
}
@IBAction func remove_TouchUpInside(_ sender: Any) {
clean()
handlePost()
}
func sendDataToDatabase(photoUrl: String) {
let ref = Database.database().reference()
let postsReference = ref.child("posts")
let newPostId = postsReference.childByAutoId().key
let newPostReference = postsReference.child(newPostId)
newPostReference.setValue(["photoUrl": photoUrl, "caption": captionTextView.text!], withCompletionBlock: {
(error, ref) in
if error != nil {
ProgressHUD.showError(error!.localizedDescription)
return
}
ProgressHUD.showSuccess("Success")
self.clean()
self.tabBarController?.selectedIndex = 0 // switches user back to selected tabbar 0 = first 1 = second etc.
})
}
func clean() {
self.captionTextView.text = ""
self.photo.image = UIImage(named:"placeholder-photo")
self.selectedImage = nil
}
}
extension CameraViewController: UIImagePickerControllerDelegate,
UINavigationControllerDelegate {
func imagePickerController(_ picker: UIImagePickerController,
didFinishPickingMediaWithInfo info: [String : Any]) {
print("did finish picking media")
if let image = info["UIImagePickerControllerOriginalImage"]
as? UIImage {
selectedImage = image
photo.image = image
}
// profileImage.image = infoPhoto
dismiss(animated: true, completion: nil)
}
}
import UIKit
import ProgressHUD
import FirebaseStorage
import FirebaseDatabase
class CameraViewController: UIViewController {
@IBOutlet weak var photo: UIImageView!
@IBOutlet weak var shareButton: UIButton!
@IBOutlet weak var captionTextView: UITextView!
@IBOutlet weak var removeButton: UIBarButtonItem!
var selectedImage: UIImage?
override func viewDidLoad() {
super.viewDidLoad()
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.handleSelectPhoto))
photo.addGestureRecognizer(tapGesture)
photo.isUserInteractionEnabled = true
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
handlePost()
}
func handlePost(){
if selectedImage != nil {
self.shareButton.isEnabled = true
self.removeButton.isEnabled = true
self.shareButton.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 1)
} else {
self.shareButton.isEnabled = false
self.removeButton.isEnabled = false
self.shareButton.backgroundColor = .lightGray
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
view.endEditing(true)
}
@objc func handleSelectPhoto(){
let pickerController = UIImagePickerController()
pickerController.delegate = self
present(pickerController, animated: true, completion: nil)
}
// Share photos to the storage database
@IBAction func shareButton_TouchUpInside(_ sender: Any) {
view.endEditing(true)
ProgressHUD.show("Please wait...", interaction: false)
if let profileImg = self.selectedImage, let photoData = profileImg.jpegData(compressionQuality: 0.1) {
let photoIdString = NSUUID().uuidString
print(photoIdString)
let storageRef = Storage.storage().reference(forURL:Config.STORAGE_ROOT_REF).child("Posts").child(photoIdString)
storageRef.putData(photoData, metadata: nil, completion: { (metadata, error) in
if error != nil {
ProgressHUD.showError(error!.localizedDescription)
return
}
let photoUrl = metadata?.downloadURL()?.absoluteString
self.sendDataToDatabase(photoUrl: photoUrl!)
})
} else {
ProgressHUD.showError("Profile image can't be empty")
}
}
@IBAction func remove_touchUpInside(_ sender: Any) {
clean()
handlePost()
}
func sendDataToDatabase(photoUrl:String){
let ref = Database.database().reference()
let postsReference = ref.child("posts")
let newPostId = postsReference.childByAutoId().key
let newPostReference = postsReference.child(newPostId)
newPostReference.setValue(["photoUrl": photoUrl, "caption": captionTextView.text!], withCompletionBlock: {
(error, ref) in
if error != nil{
ProgressHUD.showError(error!.localizedDescription)
return
}
ProgressHUD.showSuccess("Success")
self.clean()
self.tabBarController?.selectedIndex = 0
})
}
func clean(){
self.captionTextView.text = ""
self.photo.image = UIImage(named: "placeholder-img")
self.shareButton = nil
}
}
extension CameraViewController : UIImagePickerControllerDelegate, UINavigationControllerDelegate {
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
print("did Finish picking media")
if let chosenImage = info[.originalImage] as? UIImage {
selectedImage = chosenImage
photo.image = chosenImage
}
dismiss(animated: true, completion: nil)
}
}