【问题标题】:Generate Firebase Storage download url before uploading the file在上传文件之前生成 Firebase 存储下载 url
【发布时间】:2021-01-26 18:13:38
【问题描述】:

Firebase 存储中是否有办法生成指向任何内容的下载 url,以便稍后将文件上传到该 url?类似的东西(在 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 个文件 - 其中一个没有从任何地方引用。如果我能做这样的事情,第二次上传将转到我的“更新”案例(而不是此处显示的“新照片”案例)——文件将被正确切换。

【问题讨论】:

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


    【解决方案1】:

    Firebase 存储中是否有办法生成指向任何内容的下载 URL,以便稍后将文件上传到该 URL?

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

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

    【讨论】:

    • 好的,我明白了。那么,有没有办法实现安全的连续上传呢? (远离孤立文件的可能性)
    • 我不知道你所说的“孤立文件”是什么意思,但是如果上传成功,那么使用它的 URL 是安全的。
    • 我的意思是,如果我上传一个文件并保存到 Firestore 中的相应文档,然后在第一个文件完成之前为同一项目上传另一个文件,我将在 Storage 中获得两个文件,只有Firestore 中的一个 uri(因为第二个将覆盖第一个)。我需要一种方法来确定当前正在为该项目上传文件。
    • 是的,如果您覆盖同一属性上的 URL,您将获得该行为。例如,如果您在文档中有一个名为 imageUrl 的属性,当您上传第一张图片时,该 URL 会添加到该属性中。当您添加第二张图片时,当您获取 URL 时,如果您将其写在同一个属性上,您最终会得到只有一个 URL 的两张图片,这是不正确的。您拥有的最佳选择是将每个 URL 添加到 URL 数组中。这样您就可以存储多个 URL 而不会覆盖旧 URL。对吗?
    • 这意味着我必须上传-获取-设置。我想这是可能的,我会试试看。谢谢。
    猜你喜欢
    • 2021-11-06
    • 1970-01-01
    • 2018-12-30
    • 2017-07-08
    • 2018-12-28
    • 1970-01-01
    • 2018-01-24
    • 2020-05-24
    • 2020-07-30
    相关资源
    最近更新 更多