php - 会话临时文件夹

时间:2011-10-28 20:28:42

标签: php mkdir temp

想法是这样的:

  1. 用户在某个“temp”文件夹中上传文件,该文件夹只存在于当前会话中。
  2. 用户注册
  3. 文件表单“temp”文件夹被移动到永久文件夹aka storage。
  4. 我可以这样做:

    mkdir('tempfiles/'.session_id(), 777)
    

    上传文件:

    if (move_uploaded_file($_FILES['my_files']['tmp_name'], 'tempfiles/'.session_id().'/')) {
      // echo "success";
    }
    

    当用户注册时,文件被移动到某些其他文件夹,临时文件夹被删除如下:

    /* some function to empty dir */
    rmdir('tempfiles/'.session_id())
    

    问题: 如果用户上传后没有注册怎么办?如何删除临时文件夹?

    使用tempnam功能,我可以创建一个“将自我删除”的文件夹。 但在Windows服务器中,我无法创建例如tempnam('/tmp/test', '');,只需设置3个字符前缀:C:\Windows\Temp\pre569E.tmp

    我唯一的想法是写入临时文件夹的数据库路径。

    欢迎任何帮助。

1 个答案:

答案 0 :(得分:2)

如果用户未注册,则必须手动进入并清理这些文件。如果您单独保留原始临时文件,PHP将仅自动清理上载。由于您已明确将其移出上传临时目录,这意味着完全由您来清理。

你不能rmdir非空目录。您必须先删除该目录中的所有文件。最简单的方法是

$files = glob('tempfiles/' . session_id());
foreach($files as $file) {
   unlink($file);
}

更容易的是不为每个用户创建一个子目录。将文件移出上传临时目录(因此PHP不会自动清理它)并将其存储在另一个中间目录中,其中session_id()作为其文件名。这将每个未注册的用户限制为在abbeyance中保存的单个文件,但这可能是一件好事。所有用户的文件都会混合在一起,但由于每个用户都有一个基于会话的唯一名称,因此没有冲突。

你仍然需要清除那些选择不注册的用户的孤立文件,但这对于检查每个临时文件中是否存在匹配的会话文件都是一件简单的事情 - 如果没有会话文件,然后用户放弃了会话,PHP已经删除了陈旧的会话文件。因此,您可以通过定时作业进行交叉检查并删除任何没有匹配会话的文件。