我遇到了以下问题:我有一个多步骤表单,一步用户将图像上传到服务器,然后进一步提供其他信息,当此信息无效时,不应提交数据 - 也是图像应该删除。
我正在考虑PHP会话,但我在这里阅读PHP - Store Images in SESSION data?这是效率低下的方式。每次你在表单中继续步骤时,图像都会被重新加载(在会话中)并且正如有人提到的那样“你会希望它只有它需要的那么大而你需要在你不需要时立即删除它因为会话中的大量信息会减慢会话启动速度。“ - 这里我有一个问题:它会减慢上传文件或所有用户会话的用户会话的速度吗?
我必须提到我正在寻找不依赖于操作系统脚本(cron或其他)的解决方案 - 我无权运行此类脚本。
对我来说,完美的解决方案是:将图像保存在磁盘上(例如在以会话ID命名的某个文件夹中),然后在表单的最新步骤之后移动此图像或根据表单验证删除。如果用户意外破坏会话(例如关闭浏览器),当然应该删除带有图像的文件夹。简而言之,我需要像回复事件“破坏会话”一样的事情。
答案 0 :(得分:1)
最佳解决方案是将图像保存在临时位置的磁盘上。然后,您可以在用户的会话中存储文件的文件名。
关于清理孤立会话,您可以编写自己的会话保存处理程序并使用session_set_save_handler().
进行设置实际上,您需要编写自己的处理程序来打开,保存,阅读,编写,销毁和垃圾收集会话。
在您的情况下,您在破坏和垃圾收集中会有一些额外的代码,它们也会删除连接到该会话的不需要的图像。
这是关于编写自己的自定义会话处理程序的pretty good blog post。该示例使用MySQL作为存储后端,但您应该能够将其调整为您选择的存储处理程序。
答案 1 :(得分:0)
我认为phpdev的想法是将文件存储到磁盘上的临时位置并在$_SESSION
中记录位置,但我会选择更简单的“垃圾”(或者更不需要的图像)收集例程。
我将清理例程绑定到一些用户触发的事件(您选择图像上传,临时目录中图像的成功复制等)并且只需要清理例程glob()
或opendir()
所有文件的临时目录,并删除任何早于某个预定值的文件。
这样你可以在“开箱即用”配置中运行会话处理,而不必担心任何自定义会话处理程序。