我已经构建了一个系统,用户可以通过该系统启动项目并将文件上传到此项目。当他们创建项目时,我专门为该项目创建一个目录,所有上传都填充此目录。但是,我已经实现了一个系统,允许用户删除该项目,删除目录中的所有文件,然后删除目录本身。
在当地(在MAMP上),这很有魅力;然而,在实时服务器上却没有。对于目录删除,我使用了一个教程网站(下面发布)的一段代码,正如我所说,在本地网络服务器上工作正常。
$name = $_POST['projectName'];
rrmdir("../../project/$name");
function rrmdir($dir) {
if (is_dir($dir)) {
$objects = scandir($dir);
foreach ($objects as $object) {
if ($object != "." && $object != "..") {
if (filetype($dir."/".$object) == "dir") rrmdir($dir."/".$object); else unlink($dir."/".$object);
}
}
reset($objects);
rmdir($dir);
echo "Directory Removed";
}
答案 0 :(得分:3)
非常小心:
$name = $_POST['projectName'];
rrmdir("../../project/$name");
这就像是服务器文件系统的SQL注入一样,想象一下如果有人在浏览器中输入这个内容:http://www.yoursite.com/this-script.php?projectName=../../../../var/www您可能希望查看escapeshellarg()以帮助弥补这个巨大的安全漏洞realpath()将相对路径转换为绝对路径。如果目标目录不为空,则rmdir将不起作用,您需要先删除所有子目录和文件,然后才能使用rmdir。
答案 1 :(得分:2)
注意您使用相对路径,请查看此评论是否有帮助: http://php.net/manual/en/function.unlink.php#85938
答案 2 :(得分:2)
试试这个:
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator('/path/to/project/directory'),
RecursiveIteratorIterator::CHILD_FIRST);
foreach($iterator as $fileObject) {
if($fileObject->isFile()) {
echo 'Removing File: ', $fileObject->getRealpath(), PHP_EOL;
// unlink($fileObject->getRealpath());
} elseif($fileObject->isDir()) {
echo 'Removing Dir: ', $fileObject->getRealpath(), PHP_EOL;
// rmdir($fileObject->getRealpath());
}
}
取消注释rmdir
和unlink
行以实际执行删除。