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

Posted

技术标签:

【中文标题】在上传文件之前生成 Firebase 存储下载 url【英文标题】:Generate Firebase Storage download url before uploading the file 【发布时间】:2021-04-30 13:34:50 【问题描述】:

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 个文件 - 其中一个没有从任何地方引用。如果我能做这样的事情,第二次上传将转到我的“更新”案例(而不是此处显示的“新照片”案例)——文件将被正确切换。

【问题讨论】:

【参考方案1】:

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

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

How to get the download url from Firebase Storage?

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

【讨论】:

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

以上是关于在上传文件之前生成 Firebase 存储下载 url的主要内容,如果未能解决你的问题,请参考以下文章

在上传到 Firebase 存储之前,您是不是必须知道图像文件类型?

如何为上传到 Firebase 存储的文件生成访问令牌?

Angular 6 - 上传后获取 Firebase 存储文件的下载 URL

如何在将图像上传到 Firebase 之前调整其大小?

Firebase 存储安全规则和上传文件的下载令牌

为啥无法使用 Google Firebase 存储中的下载 URL 打开上传的文件?