我正在尝试使用 swift 将个人资料图片上传到我的 firebase 存储。 问题是当用户发布新的头像时,它不会覆盖第一张。在我的应用程序上,它仍然显示旧的,即使在数据库上,它显示新的已上传。
这就是我加载图片的方式
let storage = Storage.storage()
let storageRef = storage.reference()
let ref = storageRef.child("\(UserModel.docId)-ProfilePicture")
// check if file exists or not
ref.downloadURL { newUrl, error in
if let error = error {
print("Image does not exist")
self.profileImage.image = UIImage(systemName: "person.circle.fill")
} else {
print("loaded database image")
self.profileImage.sd_setImage(with: ref)
}
}
这就是我上传图片的方式。
let storage = Storage.storage()
let storageRef = storage.reference()
let photoRef = storageRef.child("\(UserModel.docId)-ProfilePicture")
let data = Data()
let uploadTask = photoRef.putFile(from: fileURL,metadata: nil) {(metadata,err) in
guard let metadata = metadata else {
print("error uploading to database")
return
}
print("Photo uploaded")
}
没有错误。
我要做的是使用以下
UIImage
方法将 Data
转换为 UIImage
:
public func jpegData(compressionQuality: CGFloat) -> Data?
您可以直接在图像上调用该函数以取回
Data
,然后您可以使用它上传到存储。
// handy extension
extension StorageMetadata {
enum MetadataContentType: String {
case jpeg = "image/jpeg"
}
convenience init(contentType: MetadataContentType) {
self.init()
self.contentType = contentType.rawValue
}
}
let storage = Storage.storage()
let remotePath = "\(UserModel.docId)-ProfilePicture"
let metadata = StorageMetadata(contentType: .jpeg)
storage.reference(withPath: remotePath).putData(theJPEGData, metadata: metadata) { (metadata, error) in
if let _ = metadata {
// success
} else {
if let error = error {
print(error)
}
// failure
}
}
解决方案是在下载文件之前清除缓存,如下所示:
SDImageCache.shared.clearDisk()