我正在用PHP创建一个在线游戏,用户可以在其中创建可玩的角色。每个角色都可以拥有用户上传的肖像。玩家可以同时拥有多个角色,并且可以随时更改他们的图片。当然,图片必须调整大小并重新压缩以避免大文件。这是我的问题:
当玩家更改其数据(其中包含图片),然后点击“保存”时,服务器端验证将启动。它会检查非唯一字符名称,空必填字段等内容。如果有任何错误,发现,它们被显示出来。在这种情况下,表单应该预先填充玩家输入的数据,因此他只需要更改故障位,而不是重新输入所有内容。但是,如何将图片保存在这种“临时”状态?
我无法预先填充文件上传字段,浏览器不允许这样做。如果我将它保存在一个临时文件中,那么必须在某些时候清理图片,因为玩家可以简单地关闭他的浏览器并中止整个过程。什么时候应该?我应该为临时文件选择什么文件名?如果播放器在两个浏览器选项卡中打开相同的字符进行编辑,则它们不应该冲突(每个都应该有自己的副本)。
你会如何解决这个问题?
答案 0 :(得分:10)
我将文件保存到临时位置,并在文件名中存储唯一标识符和当前时间戳。然后将文件名放在用户的会话中。当用户成功创建或更新其帐户时,您将图像文件保存到其永久位置并删除临时文件。您可以运行cron进程来扫描临时目录并检查时间戳,删除任何早于到期时间的文件(可能是一小时)。
如果您无法运行cron作业,则每次成功创建/更新验证时都可以始终启动目录清理。这可能会更低效(额外的目录读取以及每次成功提交时可能的文件操作)但除非您处理大量流量,否则您可能甚至都不会注意到。
答案 1 :(得分:0)
创建一个表来保存对图像的引用。
上传文件时,如果是有效图像,请执行所有调整大小等操作,并在表格中创建指向该文件的记录。
将参考记录的id与表单数据一起传递。重新显示表单时显示图像,因此用户知道他们不必重新上传。
当你最终接受新的角色对象时,设置avatar_id或其他。
运行常规cron-job来剔除孤立的图像记录(也删除磁盘上的文件)。
答案 2 :(得分:0)
您可以随时填充禁用的文本框以保存图片的名称 - 它不会填充浏览输入字段,但总比没有好。对于编辑,为避免冲突,您可以为每个用户的字符创建一些“修改”列,并在字符编辑请求中将值更改为true。当用户保存角色时,将其设置为false。对于每个编辑请求,仅在“修改”为假时才授予它。
答案 3 :(得分:0)
我建议立即更新图像,无论表单中的错误如何,或者将图像更新分离为单独的表单。这样,没有复杂的状态机和清理,你就可以解决两个问题。