firebase - 上传文件之前生成 Firebase 存储下载 url

标签 firebase kotlin google-cloud-firestore firebase-storage

Firebase Storage 是否有办法生成一个不指向任何内容的下载网址,以便稍后将文件上传到该网址?类似的东西(在 Kotlin 中):

    fun generateItemPhotoUrl(id: String) =
        storageRef.child("$Id/${generateUniqueName()}.${COMPRESS_FORMAT.name}").downloadUrl

此代码返回失败的任务...

我想要这个,这样我的上传过程就可以如下所示:

// Case: old photo is null but new one is not - upload new photo to a new uri
generateItemPhotoUrl(itemId).continueWithTask { generateTask ->
    if (generateTask.isSuccessful)  {
        val destUrl = generateTask.result.toString()

        // Uploading may take time, so first update document to hold a uri, so consecutive
        // calls will result in updating instead of uploading a new file
        updateItemPhoto(itemId, destUrl).continueWithTask { updateTask ->
            if (updateTask.isSuccessful) 
                uploadFileToDest(destUrl, newImage).continueWithTask { uploadTask ->
                    if (!uploadTask.isSuccessful) updateItemPhoto(itemId, null)
                }
        }
    }
}

正如代码中所解释的,我需要这样做来防止连续两次更新项目照片的速度太快,以至于第一次无法完成上传。我最终得到了 2 个文件 - 其中一个没有从任何地方引用。如果我可以做这样的事情,第二次上传将转到我的“更新”案例(而不是此处介绍的“新照片”案例) - 文件将在其中正确切换。

最佳答案

Is there a way in Firebase Storage to generate a download URL pointing to nothing, in order to upload a file to that URL later?

不,这是不可能的。您无法提前生成存储 URL 并稍后上传文件。仅当文件成功上传到 Firebase 服务器上时,您才能获取下载 URL。这是因为来自 UploadTask 的 URL 包含在服务器上生成的 token ,并且它是 URL 的一部分。要获取上传文件的完整下载网址,请参阅我在以下帖子中的回答:

上传文件的过程是异步的,这意味着任何需要该 URL 的代码都需要位于“onSuccess()”方法内,或者从那里调用。所以不需要上传两次文件。

关于firebase - 上传文件之前生成 Firebase 存储下载 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65906918/

相关文章:

json - 当从 Firebase 接收数组/字典时

javascript - 如何使用JS将选中的数据从表格的一行传递到另一个页面

Android navArgs 背面清晰

nuxt 上的 Firebase 身份验证监听器

ios - Firebase 数据库架构 - 像 Snapchat

javascript - React 和 Firebase - 无法设置状态

java - 发生未知错误,请检查 HTTP 结果代码和服务器响应的内部异常

java - CorDapp示例构建失败

java - 为什么我们写 NextActivity::class.java 虽然这是一个 kotlin 类?

java - 为什么一开始启动应用程序时我的回收 View 没有显示?