【发布时间】:2018-08-16 23:50:32
【问题描述】:
我知道还有 2 个类似这个问题的其他问题(链接如下),我已经尝试了几个小时试图为我的代码应用解决方案,但没有成功。我正在尝试为我的应用程序构建后端,并希望将多张图片作为一个“帖子”上传到 Firebase,就像 Instagram 的功能一样。下面的代码是我的 ImageUploadManager 女巫,旨在为我的练习项目以“一篇文章中的多个图像”的方式处理上传到 Firebase 的照片。
其他 2 个问题的链接: Value of type 'StorageMetadata' has no member 'downloadURL'
StorageMetadata' has no member 'downloadURL'
import UIKit
import FirebaseStorage
import Firebase
struct Constants {
struct Car {
static let imagesFolder: String = "carImages"
}
}
class ImageUploadManager: NSObject {
//Below code (comented out) is for completion progress visual
func uploadImage(_ image: UIImage, /**/ progressBlock: @escaping (_ percentage: Double) -> Void, /**/ completionBlock: @escaping (_ url: URL?, _ errorMessage: String?) -> Void) {
let storage = Storage.storage()
let storageReference = storage.reference()
//storage/carImages/{customId}/image.jpg
let imageName = "\(Date().timeIntervalSince1970).jpg"
let imagesReference = storageReference.child(Constants.Car.imagesFolder).child(imageName)
if let imageData = UIImageJPEGRepresentation(image, 0.8) {
let metadata = StorageMetadata()
metadata.contentType = "image/jpg"
let uploadTask = imagesReference.putData(imageData, metadata: metadata, completion: { (metadata, error) in
//Lines below may also be for progress bar not sure
if let metadata = metadata {
//Error here completionBlock(metadata.downloadURL(), nil)
} else {
completionBlock(nil, error?.localizedDescription)
}
//ends here
})
uploadTask.observe(.progress, handler: { (snapshot) in
//Below lines for Progress bar on upload
guard let progress = snapshot.progress else {
return
}
let percentage = (Double(progress.completedUnitCount) / Double(progress.totalUnitCount)) * 100
progressBlock(percentage)
//Ends here
})
} else {
completionBlock(nil, "Image could not be converted to Data.")
}
}
}
更新后的代码,答案如下:我已经用他的解决方案替换了我的旧 'let uploadTask = '
import UIKit
import FirebaseStorage
import Firebase
struct Constants {
struct Car {
static let imagesFolder: String = "carImages"
}
}
class ImageUploadManager: NSObject {
//Below code (comented out) is for completion progress visual
func uploadImage(_ image: UIImage, /**/ progressBlock: @escaping (_ percentage: Double) -> Void, /**/ completionBlock: @escaping (_ url: String?, _ errorMessage: String?) -> Void) {
let storage = Storage.storage()
let storageReference = storage.reference()
//storage/carImages/{customId}/image.jpg
let imageName = "\(Date().timeIntervalSince1970).jpg"
let imagesReference = storageReference.child(Constants.Car.imagesFolder).child(imageName)
if let imageData = UIImageJPEGRepresentation(image, 0.8) {
let metadata = StorageMetadata()
metadata.contentType = "image/jpg"
// let storageRef = Storage.storage().reference().child("profile_images").child("\(imageName).png")
let uploadTask = imagesReference.putData(imageData, metadata: metadata, completion: { (metadata, error) in
if let metadata = metadata {
imagesReference.downloadURL { (url, error) in
guard let downloadURL = url else {
// Uh-oh, an error occurred!
return
}
}
completionBlock(downloadURL, nil)
} else {
completionBlock(nil, error?.localizedDescription)
}
})
uploadTask.observe(.progress, handler: { (snapshot) in
guard let progress = snapshot.progress else {
return
}
let percentage = (Double(progress.completedUnitCount) / Double(progress.totalUnitCount)) * 100
progressBlock(percentage)
})
} else {
completionBlock(nil, "Image could not be converted to Data.")
}
}
}
【问题讨论】:
标签: ios swift firebase firebase-storage