【问题标题】:How should I handle uploads centrally and sanely in my web app?我应该如何在我的 Web 应用程序中集中、全面地处理上传?
【发布时间】:2010-12-19 13:21:59
【问题描述】:

我正在创建一个 Web 应用程序,它基本上是一个非常专业的 CMS。它是用 PHP 和 Codeigniter 编写的(虽然细节并不重要),并且是根据 MVC 模式的结构。

此网络应用程序中的许多实体都需要能够上传,例如页面、文章等。

我有一个单独工作的上传控制器。它的功能是我们有一个媒体表,它记录有关上传的元数据,然后是许多其他表,它们将特定媒体项映射到文章/页面等,例如articles_mediapages_media 等。这些表只是包含一个media_id 和一个article/page/etc_id

我显然不想在整个应用程序中复制和粘贴上传代码,因此当您在 article_create 视图上时,例如,有一个指向上传控制器的链接在弹出窗口中打开,允许您上传图片。

问题在于,在您要上传图片时,您实际上并没有创建文章/页面等,因此没有可以传递给上传控制器以映射上传媒体的 ID到特定的文章/页面等。

我感觉完全疯狂的“解决方案”是在需要上传的模型中添加一个 is_published 字段,当您进入创建页面时立即使用除 is_published = 0 之外的所有空白值创建它,然后我有我可以传递给上传者的 ID。

这确实有效,但感觉不是最理想的,对于初学者来说,我将 [可能] 最终在数据库中有许多空白行。

明智的人通常如何处理这个问题?我不需要任何具体的实施帮助,我会自己找出所需的 PHP,但我的大脑似乎无法为整体问题提出合乎逻辑的解决方案。

我认为我在 media、articles_media 和 article 之间的映射很简洁,但也许这也是问题的一部分......?

理论上我希望用户能够上传任意数量的媒体文件,但在实践中这实际上意味着非常有限,因为你只能上传一篇文章等。

我希望得到知情的意见 - 我假设对于这个问题有一个 [相对] 直接的“最佳实践”,我自己似乎无法想出。

【问题讨论】:

    标签: php architecture codeigniter web-applications


    【解决方案1】:

    关于最好的方法有很多想法,我使用的并且从未让我失望的方法是创建我的文件表的精简版本,我在其中存储上传直到 1 - 用户完成请求,我可以将文件移动到包含所有信息的决赛桌,2 - 用户取消,我将其删除,3 - 用户不做任何事情,并且一个 cron 在一周后清理它。

    这会处理同一媒体的多个文件上传(即使不是所有文件都在同一个请求上,因此您可以提供“添加更多媒体”表单),“最终”文件不会与临时文件混合,用户关闭浏览器没有完成他正在做的事情并不意味着你得到一个臃肿的文件表(cron 会清理它),等等......

    无论你做出什么选择,我都可以根据经验给你建议:不要走“is_published”的方式。你不希望出现这种情况。说真的,如果你尝试,你会恨自己的。

    【讨论】:

    • 所以你的意思是,我真的需要将媒体 ID 从上传控制器返回到将插入文章/页面等的控制器,然后才将图像添加到 article_media 表如果提交了整个表单?
    【解决方案2】:

    我通过进一步的研究发现了一些额外的选择,但我仍然不清楚什么是合理的解决方案。

    很多人建议使用 JS/Ajax,虽然我并不完全清楚它是如何工作的,但它可能会有所帮助,我将研究 Uploadify。对此有什么想法吗?另外,我有点担心使用 JS 可能不容易优雅地降级。

    另一种可能性是将图像直接存储在数据库中,但我不清楚多部分文件上传表单的实际工作方式以及我是否可以从 $_POST[] 数据中提取文件数据以将其传递给每个需要上传的控制器都可以使用的另一种通用方法。如果有人能提供更多有关这方面的信息,那就太好了。

    可能我可以将图像 ID 存储在会话数据中,但这感觉有点“hacky”?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      • 1970-01-01
      • 2010-12-26
      • 2015-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多