上传图片至Firestore遇FIRInvalidArgumentException错误求助
解决Firestore存储NSURL导致的应用崩溃问题
我一眼就定位到问题啦——你碰到的FIRInvalidArgumentException错误,核心原因是Firestore不支持直接存储NSURL类型的数据,而你代码里直接把获取到的url2(这是一个NSURL实例)传给了setData方法,所以触发了这个不支持类型的报错。
修复方案
只需要把NSURL转换成对应的字符串格式(也就是URL的绝对字符串),Firestore就能正常存储了。修改代码中写入Firestore的逻辑即可:
原来的代码行:
db.collection("Users").document(uid).setData(["AccountTypeImageURL": url2],merge: true)
修改为(增加URL转字符串的处理,同时兼顾可选值安全):
// 先把NSURL转成字符串,同时处理可选值 guard let imageUrlString = url2?.absoluteString else { print("Failed to convert URL to string") return } db.collection("Users").document(uid).setData(["AccountTypeImageURL": imageUrlString], merge: true)
优化后的完整代码
我还帮你调整了两个细节,让代码更规范:
- 合并了重复创建的存储引用
storageRef和sRef,减少冗余 - 替换了已弃用的
UIImagePNGRepresentation,改用新版的pngData()方法 - 补全了文件名的后缀(你原来的
\(imageName)png应该是\(imageName).png)
func submitButtonADD(){ let imageName = NSUUID().uuidString // 只创建一次存储引用即可 let storageRef = Storage.storage().reference().child("Account Type Images").child("\(imageName).png") guard let uid = Auth.auth().currentUser?.uid else { return } // 替换已弃用的UIImagePNGRepresentation if let uploadData = self.profileImageView.image?.pngData() { storageRef.putData(uploadData, metadata: nil, completion: { (metadata, error) in if let error = error { print(error) return } storageRef.downloadURL { url2, error in if let error = error { print(error) } else { guard let imageUrlString = url2?.absoluteString else { print("URL转字符串失败") return } let db = Firestore.firestore() db.collection("Users").document(uid).setData(["AccountTypeImageURL": imageUrlString], merge: true) } } }) } }
后续读取说明
之后从Firestore读取这个字段时,你拿到的是字符串,需要再转成URL对象使用,示例代码:
if let urlString = document["AccountTypeImageURL"] as? String, let url = URL(string: urlString) { // 这里可以用url加载图片 }
内容的提问来源于stack exchange,提问作者user9837368
相关产品推荐
相关产品推荐

