正在处理服务器上的图像上载


Dealing with image upload on server

我遇到了以下问题:我有一个多步骤表单,用户一步将图像上传到服务器,然后几步进一步提供其他信息,当这些信息无效时,不应提交任何数据,还应删除图像。

我在想PHP会话,但我在这里读到了PHP-在session数据中存储图像?这是一种效率低下的方式。每次你在表单中执行步骤时,图像都会被重新加载(在会话中),正如有人提到的那样:"你希望它只有需要的大小,你需要在不需要时立即删除它,因为会话中的大量信息会减慢会话的启动速度。"。"-这里我有一个问题:它会减慢上传文件的用户的会话或所有用户的会话的速度吗?

我必须提到的是,我正在寻找不依赖于操作系统脚本(cron或etc)的解决方案——我没有运行此类脚本的权限。

对我来说,完美的解决方案是:将图像保存在磁盘上(例如,在以会话id命名的某个文件夹中),然后在表单的最新步骤后根据表单验证移动或删除此图像。如果用户意外破坏会话(例如关闭浏览器),当然应该删除带有图像的文件夹。简而言之,我需要一些类似于回调事件"破坏会话"的东西。

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

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

实际上,您需要为打开、保存、读取、写入、销毁和垃圾收集会话编写自己的处理程序。

在您的情况下,在销毁和垃圾收集中会有额外的代码,这些代码还可以删除连接到该会话的不需要的映像。

这里有一篇关于编写自己的自定义会话处理程序的非常好的博客文章。该示例使用MySQL作为存储后端,但您应该能够将其调整为您选择的存储处理程序。

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

我会将清理例程与一些用户触发的事件联系起来(您可以选择上传图像、从临时目录中成功复制图像等),然后将清理例程glob()opendir()作为所有文件的临时目录,并删除任何早于某个预定值的值。

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