我知道还有另外2个类似的问题(在下面链接),我已经尝试了数小时试图为我的代码应用解决方案,但没有成功。我正在尝试为我的应用程序构建后端,并希望将多个图像作为一个“帖子”上传到Firebase,就像Instagram的功能一样。下面的代码是我的ImageUploadManager巫婆,用于处理我的练习项目以“一贴多张图像”方式上传到Firebase的照片。
链接到其他2个问题: Value of type 'StorageMetadata' has no member 'downloadURL'
StorageMetadata' has no member 'downloadURL'
short
更新后的代码如下:Ive用他的解决方案替换了我以前的'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: 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.")
}
}
}
答案 0 :(得分:3)
下载URL在metadata
对象上不再可用。相反,您需要在上传完成后在download URL
上致电StorageReference
。
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)
}
})
请注意,这是直接来自文档的副本,因此,我建议您也进行一些研究:https://firebase.google.com/docs/storage/ios/upload-files#upload_from_data_in_memory