2

想法是这样的:

  1. 用户在仅存在于当前会话的某个“临时”文件夹中上传文件。
  2. 用户注册
  3. “临时”文件夹中的文件被移动到永久文件夹,即存储。

我可以做这样的事情:

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

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

任何帮助都将受到欢迎。

4

1 回答 1

2

如果用户没有注册,您将不得不手动进入并清理这些文件。如果您单独留下原始临时文件,PHP 只会自动清理上传。由于您已明确将其移出上传临时目录,这意味着完全由您来清理。

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

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

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

您仍然需要从选择不注册的用户那里清理孤立文件,但这很简单,检查这些临时文件中的每一个是否没有匹配的会话文件 - 如果没有会话文件,然后用户放弃了会话,PHP 删除了陈旧的会话文件。所以你可以有一个定时的工作来做这个交叉检查并删除任何没有匹配会话的文件。

于 2011-10-28T20:37:50.700 回答