【问题标题】:Dealing with server stranded file uploads处理服务器搁浅的文件上传
【发布时间】:2014-10-09 11:27:19
【问题描述】:

我有一个在 Azure 上运行的 Angular SPA 应用,我想实现一个类似于 Medium.com 的富文本编辑器。我将为此使用一些现有的编辑器,但图像文件有问题。

问题

我希望我的编辑器也能够在内容中添加图像。我遇到的问题是我应该何时将图像上传到服务器

可能的解决方案一:选中后立即上传

好的

  • 保存内容更快,因为所有图片都可能已经上传
  • 文件从服务器 URL 上传后立即显示

不好的

  • 如果用户选择取消编辑,可能必须在服务器上删除文件
  • 如果用户只是关闭浏览器窗口,文件可能会滞留在服务器上

可能的解决方案2:保存后上传

好的

  • 使用 FileAPI 功能立即显示文件
  • 如果以任何方式放弃编辑,则不会出现搁置的服务器端文件

不好的

  • 保存内容可能需要更长时间,因为在保存内容时需要上传所有图片
  • 额外的客户端显示来自本地文件的图像

问题

我想实施解决方案 1,因为它提供了更透明的用户界面流程并且对编辑保存反应更快 => 更好的用户体验。但是我应该如何管理搁浅的文件?我可以使用一个工作进程来不时删除搁浅的文件,但我想知道这是否是这种情况的最佳方法。

您建议我如何实施?

【问题讨论】:

    标签: angularjs azure image-uploading fileapi


    【解决方案1】:

    这是非常主观的(基于意见),但我会试一试。

    您实际上遇到的问题比您想象的要大。在您的抽象方法中,您仅描述用户开始新事物时的情况。而如果用户正在编辑现有项目,我认为解决问题要困难得多。如果他/她删除图像,添加新图像并最后点击取消会发生什么。此外,如果在创建/编辑时 Internet 连接中断?

    我也会选择解决方案一。而且,当然要尽量减少“坏”的事情,因为它们并没有那么难处理。以下是我将如何解决方法 1 中的所有“坏”问题:

    • 我所有的文章(或任何正在使用编辑器编辑的用户)都会有一个布尔标志“IsDraft”或类似的东西。然后我所有的前端业务逻辑将只查找IsDraft == False 的项目。
    • 每当用户开始一篇新文章(最容易解决的问题)我立即在我的数据库中使用IsDraft=True 创建新项目
    • 有一个链接表来保持正在创建的项目 ID 和正在使用的图像文件 (blob) 之间的链接。这里的重点是,如果您不保留已使用和未使用的 blob 之间的链接,那么在决定要删除哪个 blob 以及将哪个 blob 保留在存储上时,您将非常头疼。
    • 有一个工作进程(如果我使用云服务,则为 worker process in Web Role,如果我使用网站,则为 Web Job (+ nice and short explanation here))来检查草稿和超过 XXX 天的文章。如果找到 - 删除文件 + 文章本身。

    处理现有项目的编辑更具挑战性 - 为此,我可能会采取以下方法:

    • 当用户点击编辑并将其标记为草稿时,创建整篇文章的新副本
    • 如果用户点击保存 - 将新文章(新版本)的内容与现有文章切换,将新文章标记为 IsDraft - 工作进程会将其清理。
    • 如果用户由于某种原因没有点击保存(点击取消、网络中断、计算机重新启动、浏览器崩溃、或或或..) - 稍后将由工作进程清理新文章

    如果您想更深入更疯狂,您可以在管理面板中设置一个部分,向您的用户显示草稿,以便他们继续工作,或让其自动清理。

    【讨论】:

    • 这其实是一种非常好的做事方式。我已经计划实施草稿(用户可以稍后返回)。但是考虑编辑。您的建议是,当用户开始编辑时,我应该创建现有内容的草稿副本?那太棒了。但是 Azure blob(图像)呢?它们也应该被复制或至少与帖子相关。基本上我有一个Content 表,图像在Content.Body 中表示为内容项。我应该有一个表格“ContentImages”,将它们正式关联起来。不需要复制文件。你怎么看?
    猜你喜欢
    • 1970-01-01
    • 2012-04-25
    • 2012-11-08
    • 2015-03-29
    • 2018-11-04
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多