3

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

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

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

你将如何解决这个问题?

4

4 回答 4

10

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

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

于 2009-09-15T18:42:32.330 回答
0

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

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

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

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

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

于 2009-09-15T18:44:53.883 回答
0

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

于 2009-09-15T18:45:13.010 回答
0

我建议要么立即更新图像,不管表格中的错误,要么将图像更新分离到一个单独的表格中。这样,您将摆脱两个问题,而无需复杂的状态机和清理。

于 2009-09-15T18:52:34.773 回答