【问题标题】:File uploads and structure of directories文件上传和目录结构
【发布时间】:2010-11-07 16:48:38
【问题描述】:

我想知道你们是否可以建议我构建文件上传的最佳方式。

我正在为一个网站制作一个表单,这个表单包含一个图片上传部分。在本节中,甚至在提交表单之前(通过 iframe)上传图像。由于尚未提交表单,因此我没有将图像链接到的数据库记录,因此我所做的就是在每次上传时将图像令牌插入表单。当表单提交时,我循环使用令牌并将它们链接到新创建的数据库记录。

可能很重要:

图像可能已上传,但用户可能会在提交前丢弃它们,从而在数据库中留下未使用的记录,在系统中留下未使用的图像。我必须经常清除未使用的文件。

我有点害怕图像会以某种方式丢失它们的记录并在系统中“丢失”。不过,我可能有点偏执。

你们觉得呢?

编辑:我忘了提及,但我创建了图像的缩略图版本以配合原始图像。我是否应该将“_thumb”附加到文件名并将其放在原始文件的任何位置?缩略图版本是否应该有自己的数据库记录?提前致谢。

【问题讨论】:

  • 在创建数据库记录后命名上传的文件有什么好处,例如使用 mySQL 的 LAST_INSERT_ID()?
  • 我正在考虑做一些我在这个网站上读过的事情:md5(microtime()).$user_id;然后取前 3 个字符创建 3 个目录。所以 '5b73e1993b' 会导致 '/5/b/7/5b73e1993b.jpeg' 你怎么看?

标签: php database image file-upload directory


【解决方案1】:

我这样做。

免得说您有一个“发布”部分。每次用户进入那里时,我都会创建一个令牌,该令牌在上传图像时作为隐藏字段发送,然后我将图像保存在一个临时文件夹中,我的网络服务器的文档根可以访问该文件。除此之外,我为每个文件添加了一个时间戳,因此可以像这样命名图像

<token>_<timestamp>.jpg

上传图片后,我会回复图片名称并将其保存为隐藏值。

通过这种方式,用户可以查看/删除/等图像,然后在提交表单后您就可以进行艰苦的工作。

要从临时目录中清除图像,我只需每隔几个小时对其进行迭代,然后使用 glob 获取最旧的图像,然后将其删除。

【讨论】:

    【解决方案2】:

    在将上传的文件从临时文件夹传输到最终目的地(无论是在文件系统中还是在数据库中)之前,您不会向数据库提交任何内容。这样您就不会得到“孤立”记录。

    编辑:

    您可以保存图像元数据,包括数据库中的所有图像和缩略图(作为 blob)。您还可以将图像保存在文件系统中,并仅将元数据保存在数据库中。如果您想保存每个图像的不同版本(维基风格),这完全取决于您。这允许用户回滚到以前的版本。您还可以简单地覆盖图像的任何先前版本,这可以节省大量磁盘空间。任何带有_thumb 后缀的东西都可以自动与父图像相关联。我不认为这是一个问题。

    【讨论】:

    • 我必须检查文件是否存在,移动它并记录它,是吗? (一旦表单提交)。不同版本的图像应该有自己的数据库记录,还是我应该只附加“_thumb”之类的但只有一个原始记录?
    【解决方案3】:

    我不得不经常清除未使用的文件。

    确实如此,但我认为这是唯一明智的解决方案。随着时间的推移,命名约定很难管理,并且试图在短时间内跟踪表单提交状态是自找麻烦(如果他们上传图像,离开办公桌一个小时,回来,提交怎么办?表单..即,什么是合理的超时?)。

    与更改上传和存储策略相比,清除未使用文件的简单 cron 任务将是可靠且安全的,并且非常容易实施。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-07
      • 2013-12-15
      • 2013-04-13
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多