在 Firebase 数据库中上传图像时,将不正确的 URL 提取到数据库中。需要一些指导。(Kotlin)

Fetching incorrect URL into database during upload of images in Firebase Database. Need some guidance.(Kotlin)

我正在尝试将 url 存储在我上传到 firebase storage 的图像 firebasedatabase 中。

我尝试了一些视频指南,但其中大部分都是 outdated.I 我正在尝试使用 downloadUrl 来获取 url 但它不起作用。我是编码新手,我很感激任何建议。我已尝试 Firebase 文档,但无法将其应用到我的代码中。

    if (mImageUri != null)
    {
        val fileName= edit_text_file_name.text.toString()
        val fileReference = mStorageRef!!.child(fileName + "." + getFileExtension(mImageUri!!)
        )
        mUploadTask = fileReference.putFile(mImageUri!!)
            .addOnSuccessListener { taskSnapshot ->

                val name = taskSnapshot.metadata!!.name
                val imageUrl= taskSnapshot.metadata!!.reference!!.downloadUrl.toString()

这里的问题出在上面那行我认为是 val imageUrl

                writeNewImageInfoToDB(name!!, imageUrl)
                Toast.makeText(this@ActivityUpload, "Upload successful", Toast.LENGTH_LONG).show()
            }
            .addOnFailureListener { e -> Toast.makeText(this@ActivityUpload, e.message, Toast.LENGTH_SHORT).show() }
            .addOnProgressListener { taskSnapshot ->
                val progress = (100.0 * taskSnapshot.bytesTransferred / taskSnapshot.totalByteCount)
                mProgressBar!!.progress = progress.toInt()
            }

我希望上面的代码能给我上传图片的 URL,但我得到的是

com.google.android.gms.tasks.zzu@5a826e5" in my database whereas i am expecting a firebase url like firebasestorage.googleapis.com/v0/b/-------`

您将获得:

com.google.android.gms.tasks.zzu@5a826e5

而不是实际的 url,因为这是 downloadUrl 对象内存中的地址,该对象的类型为 Task<Uri> 不是 实际的 Uri。

根据关于如何get a download URL的官方文档:

After uploading a file, you can get a URL to download the file by calling the getDownloadUrl() method on the StorageReference:

val ref = storageRef.child(fileName + "." + getFileExtension(mImageUri!!))
uploadTask = ref.putFile(file)

val urlTask = uploadTask.continueWithTask(Continuation<UploadTask.TaskSnapshot, Task<Uri>> { task ->
    if (!task.isSuccessful) {
        task.exception?.let {
            throw it
        }
    }
    return@Continuation ref.downloadUrl
}).addOnCompleteListener { task ->
    if (task.isSuccessful) {
        val downloadUri = task.result
    } else {
        // Handle failures
        // ...
    }
}