我正在创建一个Web应用程序,它基本上是一个非常专业的CMS。它是用PHP编写的Codeigniter(尽管细节并不重要),并且是根据MVC模式的结构。
此网络应用程序中的许多实体都需要具有上传功能,例如页面,文章等。
我有一个上传控制器,它可以自行运行。它的功能是我们有一个媒体表来记录有关上传的元数据,然后是一些其他表格,它们将特定媒体项目映射到文章/页面等,以便articles_media
,pages_media
等这些表只包含media_id
和article/page/etc_id
我显然不希望在整个应用程序中复制和粘贴上传代码,因此当您在article_create视图中时,会有一个上传控制器的链接,该控制器会在弹出窗口中打开,允许您上传图片。
这个问题是,在您想要上传图片时,您实际上并没有创建文章/页面等,因此没有ID可以传递给上传控制器以映射上传的媒体到特定的文章/页面等。
感觉完全疯狂的我的“解决方案”是在需要上传的模型中添加is_published
字段,当您到达创建页面时立即使用除is_published = 0
之外的所有空白值创建它然后我有一个我可以传递给上传者的ID。
这确实有效,但感觉次优,对于初学者,我[可能]会在数据库中出现许多空行。
明智的人通常如何处理这个问题?我不需要任何特定的实现帮助,我会自己弄清楚所需的PHP,但我的大脑似乎无法为整体问题提出合理的解决方案。
我认为我在媒体,articles_media和文章之间的映射很整洁,但也许这也是问题的一部分......?
理论上我希望用户能够上传任意数量的媒体文件,但实际上这实际上意味着非常有限,因为你只能用一篇文章上传一个等等。
我很欣赏知情意见 - 我假设这个问题有一个[相对]直接的“最佳实践”,我似乎无法想出这个问题。
答案 0 :(得分:1)
关于最好的方法有很多想法,我使用的并且永远不会让我失望的是创建我的文件表的精简版本,我将上传存储到1 - 用户完成请求,我可以使用所有信息将文件移动到最终表格,2 - 用户取消并删除它,3 - 用户不执行任何操作,并且cron在一周后清理它。
这可以处理同一媒体的多个文件上传(即使并非所有人都在同一个请求上,因此您可以提供“添加更多媒体”表单),“最终”文件不会与临时文件混合,用户关闭浏览器没有完成他正在做的事情并不意味着你得到一个膨胀的文件表(cron将清理它),等等......
无论你做出什么选择,我都可以根据经验告诉你:不要采用“is_published”的方式。你不希望出现这种情况。说真的,如果你尝试的话,你会恨自己。
答案 1 :(得分:0)
我通过进一步的研究发现了一些额外的选择,但我仍然不清楚什么是合理的解决方案。
很多人都建议使用JS / Ajax,虽然我不完全清楚它是如何工作的,但它可能有所帮助,我将调查Uploadify。有没有想过这个解决方案?此外,我担心使用JS可能不容易优雅地降级。
另一种可能性是将图像直接存储在数据库中,但我不清楚多部分文件上传表单的实际工作方式以及我是否可以从$ _POST []数据中提取文件数据以将其传递给每个需要上传的控制器都可以使用的另一种通用方法。如果有人能够提供更多有关这方面的信息,那就太棒了。
我可能只会在会话数据中存储图像ID,但这感觉有点'hacky'?