ios - 在firebase上同时保存两个不同的图像
问题描述
我尝试在一个存储位置同时保存两个不同的图像
这是我保存信息的功能
var text: String = ""
var addedByUser: String?
var userImage: UIImage?
var jobImage: UIImage!
var downloadURL: String?
var userDownloadURL: String?
let ref: DatabaseReference!
init(text: String? = nil, jobImage: UIImage? = nil, addedByUser: String? = nil, userImage: UIImage? = nil) {
self.text = text!
self.jobImage = jobImage
self.addedByUser = addedByUser
self.userImage = userImage
ref = Database.database().reference().child("jobs").childByAutoId()
}
init(snapshot: DataSnapshot){
ref = snapshot.ref
if let value = snapshot.value as? [String : Any] {
text = value["text"] as! String
addedByUser = value["addedByUser"] as? String
downloadURL = value["imageDownloadURL"] as? String
userDownloadURL = value["imageUserDownloadURL"] as? String
}
}
func save() {
let newPostKey = ref.key
// save jobImage
if let imageData = jobImage.jpegData(compressionQuality: 0.5) {
let storage = Storage.storage().reference().child("jobImages/\(newPostKey)")
storage.putData(imageData).observe(.success, handler: { (snapshot) in
self.downloadURL = snapshot.metadata?.downloadURL()?.absoluteString
let postDictionary = [
"imageDownloadURL" : self.downloadURL!,
"imageUserDownloadURL" : self.userDownloadURL!,
"text" : self.text,
"addedByUser" : self.addedByUser!
] as [String : Any]
self.ref.setValue(postDictionary)
})
}
}
我尝试了以下代码
if let imageData = jobImage.jpegData(compressionQuality: 0.5), ((userImage?.jpegData(compressionQuality: 0.5)) != nil) {
但它不起作用,因为没有任何东西保存在数据库中......
你有什么想法我可以解决它吗?
解决方案
我相信问题是如何将图像上传到两个不同的位置。目前尚不清楚为什么有一个观察功能,所以这个答案忽略了它,因为它可能不需要。
从您的代码开始,您的保存功能将如下所示
func save() {
self.uploadImageTask(imageName: "my_image.png", toLocation: "jobImage")
self.uploadImageTask(imageName: "my_image.png", toLocation: "anotherLocation")
}
然后是上传功能
func uploadImageTask(imageName: String, toLocation: String) {
let theImage = UIImage(named: imageName) //set up your image here
let data = UIImagePNGRepresentation(theImage)! //we're doing a PNG
let storage = Storage.storage()
let storageRef = storage.reference()
let locationRef = storageRef.child("images").child(toLocation)
let imageLocationRef = locationRef.child(imageName)
// Upload the file to the path "images/location/imageName"
let uploadTask = locationRef.putData(data, metadata: nil) { (metadata, error) in
guard let metadata = metadata else {
print("error while uploading")
return
}
let size = metadata.size // Metadata contains file metadata such as size, content-type.
print(size)
locationRef.downloadURL { (url, error) in
guard let downloadURL = url else {
print("an error occured after uploading and then downloading")
return
}
let x = downloadURL.absoluteString
print(x) //or build a dict and save to Firebase
}
}
}
结果是存储在
/images/jobImage/my_image.png
/images/anotherLocation/my_image.png
它还将打印每个图像的路径,这些图像可以存储在 Firebase 中。
推荐阅读
- ms-access - 访问报告无法在 A3 上以全尺寸打印图表
- python - Python 包脚本仅适用于 Linux
- java - 使用单独的资源文件创建 Jar
- java - 用于高效合并 CSV 写入数据的数据结构
- node.js - 每当我在 VSCode 中开始调试时,如何防止显示运行/调试窗口
- ruby-on-rails - 我可以在种子文件中使用查找器方法吗?
- python - 从平铺图像中查找或检测单个平铺
- python - 我的文章首先显示最旧的,但我希望它首先显示新文章,如日期明智的新文章应该出现在顶部
- vue.js - 如何从 vue-fullpage 包装器中的子组件调用 fullpagejs 方法?
- blazor - Blazor 如何将 bind-value:event="oninput" 与 @oninput="FooFunc" 一起使用