【发布时间】:2020-12-05 15:02:52
【问题描述】:
我正在尝试将用户选择的图片上传到 firebase 存储,然后下载 url,以便可以将图片存储在实时数据库中,但无法让它与我的代码一起使用!我原本打算使用元数据!.downloadUrl() 但由于更新,它不再起作用,所以我迷路了。
这是我的代码:
import Firebase
import FirebaseAuth
import FirebaseDatabase
import FirebaseStorage
class createPostViewController: UIViewController {
@IBOutlet weak var profileImage: UIImageView!
@IBOutlet weak var contactEmail: UITextField!
@IBOutlet weak var contactPhoneNum: UITextField!
@IBOutlet weak var name: UITextField!
@IBOutlet weak var age: UITextField!
@IBOutlet weak var gender: UITextField!
@IBOutlet weak var lastSeen: UITextField!
@IBOutlet weak var profileDescription: UITextField!
@IBOutlet weak var postBtn: UIButton!
var imagePicker: UIImagePickerController!
var selectedImage: UIImage!
override func viewDidLoad() {
super.viewDidLoad()
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(createPostViewController.handleSelect))
profileImage.addGestureRecognizer(tapGesture)
imagePicker = UIImagePickerController()
imagePicker.allowsEditing = true
imagePicker.delegate = self
postBtn.layer.cornerRadius = 10
// Do any additional setup after loading the view.
}
@objc func handleSelect(){
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
present(imagePicker, animated: true, completion: nil)
}
@IBAction func post(_ sender: AnyObject) {
let userID = Auth.auth().currentUser?.uid
Database.database().reference().child("profiles").child(userID!).observe(.value, with: { (snapshot) in
let post: Dictionary<String, AnyObject> = [
// "userImg": as AnyObject,
"name": self.name.text as AnyObject,
"contactEmail": self.contactEmail.text as AnyObject,
"contactPhoneNum": self.contactPhoneNum.text as AnyObject,
"age": self.age.text as AnyObject,
"gender": self.gender.text as AnyObject,
"lastSeen": self.lastSeen.text as AnyObject,
"profileDescription": self.profileDescription.text as AnyObject,
]
let firebasePost = Database.database().reference().child("profiles").childByAutoId()
firebasePost.setValue(post)
})
}
func uploadImageToFireBase(image: UIImage) {
// Create the file metadata
let metadata = StorageMetadata()
metadata.contentType = "image/jpeg"
let storageRef = Storage.storage().reference()
let profileRef = storageRef.child("images/rivers.jpg")
// Upload the file to the path FILE_NAME
Storage.storage().reference().child("FILE_NAME").putData(image.jpegData(compressionQuality: 0.42)!, metadata: metadata) { (metadata, error) in
guard let metadata = metadata else {
// Uh-oh, an error occurred!
print((error?.localizedDescription)!)
return
}
// Metadata contains file metadata such as size, content-type.
let size = metadata.size
print("Upload size is \(size)")
print("Upload success")
}
}
//func uploadToCloud(fileURL : URL) {
// let storage = Storage.storage()
//let data = Data()
//let storageRef = storage.reference()
//let localFule = fileURL
//let userID = Auth.auth().currentUser?.uid
//let photoRef = storageRef.child("profilePhoto\(userID)")
//let uploadTask = photoRef.putFile(from: localFule, metadata: nil) { (metadata, err) in
// guard let metadata = metadata else {
// print(err?.localizedDescription)
// return
//}
//print("Photo Upload")
// }
// }
}
extension createPostViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate{
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let image = info["UIImagePickerControllerEditedImage"]as? UIImage {
selectedImage = image
print("success")
profileImage.image = image
uploadImageToFireBase(image: selectedImage)
} else {
print("image wasnt selected")
}
dismiss(animated: true, completion: nil)
}
}
【问题讨论】:
-
您的代码中没有任何内容会尝试将 url 存储在 Firebase 实时数据库中,并且您不会从元数据中获取该信息。此外,从您创建的文件引用中获取下载 url 以存储它(例如
let riversRef = storageRef.child("images/rivers.jpg"),但也没有其中之一。请查看入门指南Upload from data in Memory,因为它显示了执行此操作的代码。然后更新你的问题与你的实际代码并指出它在哪里不起作用。
标签: ios swift firebase firebase-storage