2012-03-24 70 views
1

我遇到了以下问题:我已经有了多步骤的形式,用户上传图片到服务器,然后几步进一步提供其他信息,当这些信息无效时,被提交 - 也应删除图像。在服务器上处理图片上传

我在想PHP会议,但是我在这里PHP - Store Images in SESSION data?,这是低效的方式读取。每当你在表单中重新加载图像(在会话中),并且有人提到“你会希望它只有它的大小,并且你需要在你不需要的时候立即删除它这是因为会话中的大量信息会减慢会话启动速度。“ - 这里我有一个问题:它会减慢上传文件或所有用户会话的用户会话的速度吗?

我不得不提到我正在寻找解决方案,它不依赖于操作系统的脚本(cron或等) - 我没有权限来运行这些脚本。

对我来说,完美的解决办法是:节省了磁盘映像(例如会话ID命名的某个文件夹),那么形态的最新步骤之后,这张图片移动,或者根据表单验证删除。如果用户意外地销毁会话(例如关闭浏览器),当然应该删除具有图像的文件夹。简而言之,我需要像callback一样的事件“销毁会话”。

回答

1

最好的解决方案是将图像保存在临时位置的磁盘上。然后,您可以将文件的文件名存储在用户的会话中。

关于清理孤立会话,您可以编写自己的会话保存处理程序,并使用session_set_save_handler().

有效地设置它,你将需要编写自己的处理程序打开,保存,读,写,破坏和垃圾收集会话。

在你的情况,你将有代码的破坏和垃圾收集也将删除连接到会话中不需要的图像的额外位。

这里有一个pretty good blog post如何编写自己的自定义会话处理程序。该示例使用MySQL作为存储后端,但您应该能够将其调整为您选择的存储处理程序。

+0

谢谢你的提示;) – biera 2012-03-24 10:37:13

+0

我对PHP会话没有太多经验。我看到我可能需要为$ destroy编写自己的回调函数。问题是:它会覆盖默认行为还是只会在默认操作后运行我的回调。我更喜欢后者,因为我不知道PHP在销毁用户会话时究竟发生了什么,所以我不想搞砸东西...... – biera 2012-03-24 10:53:02

+0

我不认为有选择地使用会话的默认行为。但是,如果您正在使用基于标准文件的会话,则只需简单地删除用户的相应会话文件即可。 – F21 2012-03-24 10:55:49

0

我认为phpdev的想法是将文件存储到磁盘上的临时位置,并在$_SESSION中记录位置,但我会用一个更简单的“垃圾”(或不需要的图像)收集例程。

我绑清除例程一些用户触发事件(您无论是图片上传,图像的成功复制出来的临时目录中,等的选择),只是有一个清理例程​​3210或opendir()临时dir为所有文件并删除比预定值更旧的值。

这样,你可以在“开箱即用”配置会话处理运行,而不必担心任何自定义会话处理程序。