You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

上传图片至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)

优化后的完整代码

我还帮你调整了两个细节,让代码更规范:

  1. 合并了重复创建的存储引用storageRef和sRef,减少冗余
  2. 替换了已弃用的UIImagePNGRepresentation,改用新版的pngData()方法
  3. 补全了文件名的后缀(你原来的\(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:41:38