【问题标题】:How do you deal with temporary picture uploads in PHP?你如何处理 PHP 中的临时图片上传?
【发布时间】:2009-09-15 18:36:46
【问题描述】:

我正在用 PHP 创建一个在线游戏,用户可以在其中创建可玩的角色。每个角色都可以有一个用户上传的肖像。一个玩家可以同时拥有多个角色,并且他们的图片可以随时更改。自然地,必须调整图片大小并重新压缩以避免大文件。这是我的问题:

当玩家更改他的数据(其中包括图片),然后点击“保存”,服务器端验证启动。它检查诸如非唯一字符名称、空必填字段等内容。如果有任何错误找到了,就会显示出来。在这种情况下,表格应该预先填充玩家输入的数据,因此他只需更改错误位,而不是重新输入所有内容。但是这样的“临时”状态怎么保存图片呢?

我无法预先填充文件上传字段,浏览器不允许这样做。如果我将它保存在一个临时文件中,则必须在某个时候清理图片,因为玩家可以简单地关闭他的浏览器并中止整个过程。那应该是什么时候?我应该为临时文件选择什么文件名?如果玩家在两个浏览器选项卡中打开同一个角色进行编辑,它们不应该发生冲突(每个选项卡都应该有自己的副本)。

你会如何解决这个问题?

【问题讨论】:

    标签: php temporary-files image upload


    【解决方案1】:

    我会将文件保存到临时位置,并在文件名中存储唯一标识符和当前时间戳。然后将文件名放入用户的会话中。当用户成功创建或更新他们的帐户后,您将图像文件保存到其永久位置并删除临时文件。您可以运行一个 cron 进程来扫描临时目录并检查时间戳,删除任何超过过期时间(可能是一个小时)的文件。

    如果您无法运行 cron 作业,您始终可以在每次成功创建/更新验证时启动目录清理。这可能效率低一些(每次成功提交都需要额外的目录读取和文件操作),但除非您处理大量流量,否则您可能根本不会注意到。

    【讨论】:

    • 不错的答案。赞成。然而,听起来很奇怪,我的客户不喜欢 cron 工作,因为他没有与它们打过交道并且不想要新的未经测试的东西。也许你可以想出另一个没有 cron 作业的解决方案?
    • 当然,只需将目录清理合并到图像上传处理代码中即可。创建/更新验证完成(成功)并删除临时图像文件后,扫描目录的其余部分以查找过期图像并删除它们。
    • 嗯...这是一个选择。实际上,我已经决定将它存储在会话而不是临时文件夹中(我将会话存储在 MySQL 中)。由于调整后的图像会非常小,我认为这不是什么大问题。
    【解决方案2】:

    创建一个表来保存对图像的引用。

    上传文件时,如果它是有效图像,请执行所有调整大小等操作,并在指向该文件的表中创建一条记录。

    将参考记录的 id 与表单数据一起传递。重新显示表单时显示图像,这样用户就知道他们不必重新上传。

    当你最终接受新的角色对象时,设置 avatar_id 或其他。

    运行常规 cron-job 以剔除孤立的图像记录(同时删除磁盘上的文件)。

    【讨论】:

      【解决方案3】:

      您始终可以填充禁用的文本框来保存图片的名称 - 它不会填充浏览输入字段,但总比没有好。对于编辑,为避免冲突,您可以为每个用户的字符创建一些“修改”列,并在字符编辑请求中将值更改为 true。当用户保存字符时,将其设置回 false。对于每个编辑请求,仅在“修改”为 false 时才授予它。

      【讨论】:

      • 当用户在打开编辑表单的情况下简单地关闭选项卡时会变得很尴尬。锁无法解除,他也无法编辑其他任何内容。
      【解决方案4】:

      我建议无论表单中是否有错误,都立即更新图像,或者将图像更新分离到单独的表单中。这样一来,您就可以摆脱两个问题,而无需复杂的状态机和清理工作。

      【讨论】:

      • 以使 UI 更烦人为代价。 :(
      • 是的,也许,但我仍然会追求这一点,因为让事情变得比他们必须的更复杂,只是自找麻烦。只是我的 2c。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-22
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 2017-03-14
      相关资源
      最近更新 更多