将图像上传到 Firebase 存储后如何获取图像 uri?

Posted

技术标签:

【中文标题】将图像上传到 Firebase 存储后如何获取图像 uri?【英文标题】:How to get image uri after uploading image to Firebase Storage? 【发布时间】:2021-10-12 01:05:48 【问题描述】:

我正在开发一个 kotlin 项目,该项目要求用户使用相机或图库插入图像,然后应用程序会将图像上传到 Firebase 存储,并将图像 uri 保存到 FireStore。 之后,我用 glide 获得所有图像并用 recyclerview 显示它。 这是我的物品类别:

data class Item(var uid: String?=null,
                     var productId:String?=null,
                     var productCategory: String?=null,
                     var productWeight: Double?=null,
                     var productDescription: String?=null,
                     var productIcon:String?=null)

稍后,我使用此代码显示图像:

override fun onBindViewHolder(holder: itemViewHolder, position: Int) 
        val produk=listOfItem[position]
        holder.kategori.text=produk.productCategory
        holder.berat.text=produk.productWeight.toString()

        //img
        Glide.with(context)
            .load(produk.productIcon)
            .into(holder.gambarBarang)

    

上传图片后我使用此代码获取图片uri:

storageReference.putFile(image_Uri!!)
                .addOnCompleteListener  task ->
                if (task.isSuccessful) 
                    val downloadUri = task.result
                    val item = Item(
                        ""+firebaseAuth.uid,
                        timeStamp,
                        kategori,
                        berat_sampah.toDouble(),
                        deskripsi,
                        ""+downloadUri,
                    )

但是当我尝试使用上述方法显示它时,图像不显示。问题在于变量 downloadUri。它没有得到正确的uri。我尝试记录它并得到:D/TAG: com.google.firebase.storage.UploadTask$TaskSnapshot@6e38b25。之后,我尝试:

storageReference.putFile(image_Uri!!)
                .addOnCompleteListener  task ->
                if (task.isSuccessful) 
                    val downloadUri = task.result?.uploadSessionUri
                    val item = Item(
                        ""+firebaseAuth.uid,
                        timeStamp,
                        kategori,
                        berat_sampah.toDouble(),
                        deskripsi,
                        ""+downloadUri,
                    )

但是运行时,图像仍然没有出现。我尝试再次记录下载 uri 并获取:

D/TAG: https://firebasestorage.googleapis.com/v0/b/rongsokin-97e5c.appspot.com/o?name=product_images%2F1628401535415&uploadType=resumable&upload_id=ADPycdv0k03oF-49BTl61tKIC4Q-05J3cfOMqYpfUi9USXOMOGQmiOYalhVOSlRr6HP-ScqN6Hfv8NVrkI_qcU-CG6U&upload_protocol=resumable

然后我尝试:

storageReference.putFile(image_Uri!!)
                .addOnCompleteListener  task ->
                if (task.isSuccessful) 
                    val downloadUri = image_Uri
                    val item = Item(
                        ""+firebaseAuth.uid,
                        timeStamp,
                        kategori,
                        berat_sampah.toDouble(),
                        deskripsi,
                        ""+downloadUri,
                    )

之后,我再次记录 downloadUri 并获得: D/TAG: content://media/external/images/media/85 我知道这不是正确的方法,因为我只获取图像的本地 uri,但我这样做是为了找出我显示图像的方式是错误的还是我的方式错误m 获取 uri。这种方式成功地显示了图像(虽然没有正确的uri)。有谁知道上传到firebase后如何获取图像uri然后用它来显示图像?

【问题讨论】:

我们无法知道为什么图像没有出现,因为我们在这里看不到任何变量的内容,而且我们不知道您在做什么创建后的项目。任何事情都可能出错。请编辑问题以显示足够的调试详细信息,以便更清楚地了解什么不是按您期望的方式工作。 @DougStevenson,感谢您的建议,我已经编辑了我的问题并添加了我的课程代码和一些日志 【参考方案1】:

上传文件后必须调用getDownloadUrl(),或者至少调用引用路径上的方法。

storageRef.child("users/me/profile.png").downloadUrl.addOnSuccessListener 
    // Got the download URL for 'users/me/profile.png'
.addOnFailureListener 
    // Handle any errors

完整示例:

val ref = storageRef.child("images/mountains.jpg")
uploadTask = ref.putFile(file)

val urlTask = uploadTask.continueWithTask  task ->
    if (!task.isSuccessful) 
        task.exception?.let 
            throw it
        
    
    ref.downloadUrl
.addOnCompleteListener  task ->
    if (task.isSuccessful) 
        val downloadUri = task.result
     else 
        // Handle failures
        // ...
    

【讨论】:

以上是关于将图像上传到 Firebase 存储后如何获取图像 uri?的主要内容,如果未能解决你的问题,请参考以下文章

Firebase存储将图像成功上传到Firebase存储后获得下载URL

Flutter - 将图像上传到 Firebase 存储

如何从输入字段将图像上传到 Firebase 云存储?

如何以BLOB格式将图像上传到Firebase存储?

使用颤振将图像上传并存储到firebase

如何将从firebase存储上传的图像保存到firestore数据库中的currentUser