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

在addOnSuccessListener中遍历UploadTask遇类型转换错误,如何获取图片下载链接?

问题原因及解决方法

错误根源

Tasks.whenAllSuccess<UploadTask>(tasks)的泛型声明错误。whenAllSuccess会收集每个上传任务完成后的**UploadTask.TaskSnapshot**实例,而非UploadTask本身。你强行将返回的Snapshot转成UploadTask,自然触发ClassCastException。

另外还有个隐藏问题:你复用了同一个ByteArrayOutputStream对象,这会导致所有图片的字节数据叠加在一起,最终上传的是重复/错误的图片内容,每个图片压缩时都要新建独立的ByteArrayOutputStream。

修正后的代码

val tasks = mutableListOf<UploadTask>()

listImg.forEach { imgBitmap ->
    if (bitmap!!.byteCount != imgBitmap.byteCount) {
        // 每个图片单独创建ByteArrayOutputStream,避免数据重叠
        val baos = ByteArrayOutputStream()
        imgBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos)
        val data = baos.toByteArray()
        val uploadTask = spaceRef.putBytes(data)
        tasks.add(uploadTask)
    }
}

// 泛型声明为TaskSnapshot,或省略泛型让编译器自动推断
Tasks.whenAllSuccess<UploadTask.TaskSnapshot>(tasks).addOnSuccessListener { taskSnapshots ->
    val urls = mutableListOf<Uri>()
    
    lifecycleScope.launch {
        taskSnapshots.forEach { snapshot ->
            // 从Snapshot获取对应的StorageReference,再获取下载链接
            val downloadUrl = snapshot.storage.downloadUrl.await()
            urls.add(downloadUrl)
        }
        // 这里可以使用urls做后续操作,比如保存到数据库
    }
}

额外说明

  • 如果不需要等待所有任务完成再统一处理,也可以在单个uploadTask的addOnSuccessListener里直接获取下载链接,但whenAllSuccess更适合批量任务的统一收尾。
  • 注意处理可能的异常,比如可以在launch里添加try-catch块捕获下载链接获取失败的情况。

内容的提问来源于stack exchange,提问作者Captai-N

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:25:17