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

Kotlin实现Firebase图片上传失败求助:Task执行未成功

Firebase图片上传Task失败问题修复

先看修复后的完整代码:

val fileRef: StorageReference = storageProfilePicRef!!.child("${firebaseUser!!.uid}.jpg")
val uploadTask = fileRef.putFile(imageUri!!)

// 监听上传阶段的失败情况
uploadTask.addOnFailureListener { exception ->
    progressDialog.dismiss()
    Toast.makeText(this, "上传失败: ${exception.message}", Toast.LENGTH_LONG).show()
}

uploadTask.continueWithTask { task ->
    if (!task.isSuccessful) {
        progressDialog.dismiss()
        task.exception?.let { throw it }
    }
    // 从上传快照中获取存储引用,请求对应文件的下载URL
    return@continueWithTask task.result.storage.downloadUrl
}.addOnCompleteListener { task ->
    progressDialog.dismiss()
    if (task.isSuccessful) {
        val downloadUrl = task.result.toString()
        val ref = FirebaseDatabase.getInstance().reference.child("Users")

        val userMap = hashMapOf(
            "fullname" to full_name_profile_frag.text.toString().lowercase(),
            "username" to username_profile_frag.text.toString().lowercase(),
            "bio" to bio_profile_frag.text.toString().lowercase(),
            "image" to downloadUrl
        )

        // 数据库更新操作也要监听结果
        ref.child(firebaseUser.uid).updateChildren(userMap)
            .addOnSuccessListener {
                Toast.makeText(this, "账户信息更新成功", Toast.LENGTH_LONG).show()
                startActivity(Intent(this@AccountSettingsActivity, MainActivity::class.java))
                finish()
            }
            .addOnFailureListener { dbException ->
                Toast.makeText(this, "数据库更新失败: ${dbException.message}", Toast.LENGTH_LONG).show()
            }
    } else {
        Toast.makeText(this, "获取下载URL失败: ${task.exception?.message}", Toast.LENGTH_LONG).show()
    }
}

关键问题点说明:

  • 异常后资源未释放:原代码中throw it之后的progressDialog.dismiss()永远不会执行,现在将dismiss移至throw之前,确保无论成功失败都能关闭进度框。
  • 上传阶段错误未捕获:新增addOnFailureListener监听上传过程中的错误(比如权限不足、文件损坏等),避免上传失败后无任何提示。
  • 下载URL获取逻辑优化:改用上传任务快照中的存储引用获取下载URL,比直接调用fileRef.downloadUrl更可靠,确保获取的是当前上传文件的最新有效URL。
  • 数据库更新未处理结果:原代码直接调用updateChildren后就跳转页面,现在补充成功/失败监听,让用户明确知道数据库操作是否完成。
  • 错误提示更精准:将原代码中模糊的task.toString()改为具体的异常信息,方便快速定位问题。

另外排查时还需确认:

  • Firebase Storage规则是否允许当前用户上传文件(测试阶段可临时设置为allow read, write: if true;,上线后再调整为严格权限)。
  • imageUri是否指向有效且可读的本地文件。
  • 设备网络连接正常,Firebase初始化配置无误。

内容的提问来源于stack exchange,提问作者Test ing

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 09:45:34