在上传文件之前生成 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 存储之前,您是不是必须知道图像文件类型?