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

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

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

你会如何解决这个问题?

有帮助吗?

解决方案

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

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

其他提示

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

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

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

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

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

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

我建议立即更新图像,无论表单中的错误如何,或者将图像更新分离为单独的表单。这样,没有复杂的状态机和清理,你就可以解决两个问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top