【问题标题】:Does Firebase Storage support bundled uploads?Firebase 存储是否支持捆绑上传?
【发布时间】:2017-01-08 02:13:16
【问题描述】:

考虑到 Firebase 存储只是一个文件存储 CDN,并且没有任何特殊的图像功能(IE:缩略图生成),因此我们需要在客户端生成这些图像。

我遇到过几次的问题是我们最终会得到孤立文件,因为用户将准备上传图像,并且考虑到我们必须分别上传原始图像和缩略图,用户可以取消上传或退出应用程序。

如果其中一张图片已经上传,而另一张没有上传,那么存储中就有一个孤立的文件没有在任何地方使用,最糟糕的是它永远不会被使用。

好的,所以如果用户手动取消上传,我们可以检查第一次上传是否成功以及是否发起了删除请求。没什么大不了的,但在应用程序退出的情况下,我们无能为力。

我希望有,或者至少很快会有,以“全部成功或全部失败”的方式上传一批文件,类似于 Firebase 数据库中的事务。

我怎样才能解决这个问题?我只需要处理孤立文件..吗?有什么方法可以轻松删除 Firebase 存储中的孤立图像,而无需下载我们所有的用户、生成链接集合、然后下载 Firebase 存储上所有文件的链接、检查链接然后初始化删除请求?似乎是一项相当繁重的任务。

【问题讨论】:

    标签: javascript firebase firebase-storage


    【解决方案1】:

    您可以做的是在数据库中一切正常时在user 中设置complete 标志,并保持该字段的索引。如果在所有任务完成之前出现任何问题(中止、退出、崩溃...),则不会设置该字段。

    然后,一个基本的内务管理脚本将只检查此标志为 false 的用户条目:

    firebaseRef.child('users')
      .orderByChild('complete')
      .equalTo(false)
      .once('value')
      .then(ref => {
        // ref.val() -> contains all invalid users, check only them, fix/delete stuff, etc
      });
    

    另外,您不必启动文件下载来检查其是否存在,您可以使用getDownloadUrl() 方法:

    storageRef.child("file.png").getDownloadURL()
      .then(() => {
        // The file exists
      })
      .catch(() => {
        // The file does not exists
      })
    

    完整的工作流程细节:

    1. 在数据库中创建用户,complete 字段为false
    2. 之后开始所有其他操作,例如上传图片、创建缩略图等(此时无需在数据库中存储您不需要的任何内容,例如链接)
    3. 之后且仅在之后complete 字段更新为true

    关于 UI:只显示 complete 字段设置为 true 的用户,以避免显示损坏

    结果:如果发生任何崩溃 - 出于任何原因 - 在第 3 步之前,用户字段 complete 将保持在 false

    【讨论】:

    • 这种方法的唯一问题是我们假设如果用户退出应用程序,文件的链接将存储在用户的对象中。由于这两个图像完全相关,因此它们被保存为:{image: '...', thumbnail: '...'},并且一旦没有另一个就不能存在,否则加载对象的应用程序的 UI 将中断。因此,我们仍然需要检查每个用户的链接与存储中的可用对象。
    • 我不确定是否会关注你。无需存储文件链接,并处理任何中止/退出/崩溃。我更新了我的答案,以便更清楚地了解我建议的工作流程。
    • 即使用户字段 complete 设置为 true 或 false,这也没有对上传到存储中的项目的任何引用。如果上传了一个项目,完成将是错误的,但我们如何知道在 cron-job 期间要删除哪些项目?存储中的项目使用RFC 4122 UUIDs 命名,因为可以覆盖具有相同名称的项目。也许问题在于我在 Firebase 存储中存储数据的方式。我将所有用户上传的内容都放在一个目录中。您是否为此方法推荐不同的文件结构?无法弄清楚如何决定...
    • 根据complete 函数为假,需要从存储中删除哪些图像。用户也可能有很多照片,所以我不想删除他们所有的照片,只是上传和孤立的照片。我说“孤儿”是因为上传完成后,下载链接被添加到用户节点下的photos: []中。
    • 好吧,我认为这是用户创建过程中的一种个人资料图片,我不知道为什么(而且是错误的:))。无论如何,基本思想是使用手动事务机制来识别存储错误 - 在数据库的帮助下。事实上,如果我们谈论纯存储操作,您可以将其与数据库操作配对。例如incompleteFileOps/xxx 树,您在开始文件操作时放置一个项目,只有在完全成功时才删除该项目。然后,检查早于 1 小时的时间戳,以修复/删除有问题的存储项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多