在 Web 应用程序中实现全功能媒体上传

Kar*_*ski 1 php upload symfony jquery-file-upload

假设我们有处理创建、读取、更新和删除文章的 Web 应用程序,并且每篇文章都应该有图片库。我必须在文章和画廊之间建立一对一的关系,在画廊和媒体之间建立一对多的关系。

HTML5 提供了很多功能,例如 multiupload,因此我想为此使用这个出色的http://blueimp.github.io/jQuery-File-Upload/插件。问题是如何像其他表单的数据一样处理“内存中”的文件上传?

例如,当我们显示创建新文章的页面时,我们应该能够填写文章的数据字段并选择要上传的图片,接下来当我们点击保存按钮时,图片应该开始上传,然后提交表单。当验证失败时,图像仍应显示在前端,但在服务器端 nothink 应保存。

解决方案之一是在显示整个表单之前创建一些类似“创建实体会话临时 id”的想法,该 id 可用于创建临时目录以保存上传,因此在成功保存表单后,这些图像可以移动到适当的目录,但是如何使“创建实体会话临时ID”?

我认为的另一个解决方案是“使用编辑 ID”方法,因为我们可以使用以前保存的画廊 ID 处理上传,但有时我无法使用画廊保存新的空白文章,因为某些字段不应为空在数据库中。

对于 Rails,我在自述文件中看到了https://github.com/thoughtbot/paperclip gem:

Paperclip 旨在作为 Active Record 的简单文件附件库。其背后的意图是使设置尽可能简单,并尽可能像对待其他属性一样对待文件。这意味着它们不会保存到磁盘上的最终位置,如果设置为 nil,它们也不会被删除,直到调用 ActiveRecord::Base#save。

我的问题是它是如何工作的?

dev*_*eep 5

在创建掩码上启用文件上传的问题是您最终会得到孤立的文件。这是因为用户可以在不保存实际实体的情况下触发上传。在创建一个自己的 UploadBundle 时,我想了一会儿这个问题,得出的结论是没有真正合适的解决方案。

我最终是这样实现的:

鉴于我们的问题是由孤立文件引起的,我创建了一个Orphanage负责管理这些文件的文件。上传的文件将首先与 session_id 一起存储在单独的目录中。这有助于区分不同用户的文件。提交表单以创建实际实体后,您可以仅使用会话 ID 从孤儿院检索文件。如果表单有效,您可以将文件从临时孤儿院目录移动到文件的最终目的地。

这种方法有一些缺陷:

  • 孤儿院目录本身应该使用 cron 作业等定期清理。
  • 如果用户将上传文件并选择不提交表单,而是使用新表单重新开始,则新上传的文件将被移动到同一目录中。因此,您将在第一次和第二次上传文件后获得上传的文件。

这不是此问题的最终解决方案,而是更多的解决方法。在我看来,它比使用临时实体或基于会话的存储系统更干净。

提到的包在 Github 上可用,并且支持OrphanagejQuery File Uploader插件。

1up-lab/OneuploaderBundle