我有一个基本的PHP脚本,显示目录的文件内容。这是脚本:
<?php
$Dept = "deptTemplate";
if(isset($_REQUEST['dir'])) {
$current_dir = $_REQUEST['dir'];
} else {
$current_dir = 'docs';
}
if ($handle = opendir($current_dir)) {
while (false !== ($file_or_dir = readdir($handle))) {
if(in_array($file_or_dir, array('.', '..'))) continue;
$path = $current_dir.'/'.$file_or_dir;
if(is_file($path)) {
echo '`<a href="/Implementation/'.$Dept.'/'.$path.'">'.$file_or_dir.'</a> - [Delete button/link]<br/>`';
} else {
echo '`<a href="testFolderiFrame.php?dir='.$path.'">`'.$file_or_dir."\n`</a>` - [Delete button/link]`<br/>`";
}
}
closedir($handle);
}
?>
我正在尝试创建一个显示在每个文件旁边的删除链接/按钮,单击此按钮时,相应的文件将被删除。你知道怎么做吗?
答案 0 :(得分:6)
使用内置的unlink($filepath)
功能。
答案 1 :(得分:1)
当然,您必须使用unlink()
和rmdir()
,并且您需要一个递归目录删除功能,因为rmdir()
不适用于包含文件的目录。您还需要确保删除脚本非常安全,以阻止人们删除所有内容。
递归函数的类似内容:
function Remove_Dir($dir)
{
$error = array();
if(is_dir($dir))
{
$files = scandir($dir); //scandir() returns an array of all files/directories in the directory
foreach($files as $file)
{
$fullpath = $dir . "/" . $file;
if($file == '..' || $file == '.')
{
continue; //Skip if ".." or "."
}
elseif(is_dir($fullpath))
{
Remove_Dir($fullpath); //recursively remove nested directories if directory
}
elseif(is_file($fullpath))
{
unlink($fullpath); //Delete file otherwise
}
else
{
$error[] = 'Error on ' . $fullpath . '. Not Directory or File.' //Should be impossible error, because everything in a directory should be a file or directory, or . or .., and thus should be covered.
}
}
$files = scandir($dir); //Check directory again
if(count($files) > 2) //if $files contains more than . and ..
{
Remove_Dir($dir);
}
else
{
rmdir($dir); //Remove directory once all files/directories are removed from within it.
}
if(count($error) != 0)
{return $error;}
else
{return true;}
}
}
然后你只需要通过GET或者某些东西将要删除的文件或目录传递给脚本,可能需要urlencode()
或其他东西,确保它是具有删除权限的授权用户试图删除这些东西,unlink()
如果它是一个文件,Remove_Dir()
如果它是一个目录。
在删除目录/文件之前,您必须将目录或文件的完整路径添加到脚本中的目录/文件中。
您需要安全性的一些事情首先要确保删除发生在它应该发生的地方,这样有人就无法执行?dir=/
或某事并试图从root用户删除整个文件系统可以通过使用类似$dir = '/home/user/public_html/directories/' . $_GET['dir'];
之类的方法将适当的路径添加到输入上来规避这一点,当然它们可能会删除该路径中的所有内容,这意味着您需要确保用户有权执行此操作如此。
为了以防万一,需要定期备份文件。
答案 2 :(得分:0)
这样的东西?未经测试......
<?php
echo '`<a href="/Implementation/'.$Dept.'/'.$path.'">'.$file_or_dir.'</a> - [<a href=\"?thispage&del=1&file_or_dir=$file_or_dir\">Delete button/link</a>]<br/>`';
?>
<?php
if ($_GET['del'] == 1 && isset($_GET['file_or_dir']){
unlink ("path/".$_GET['file_or_dir']);
}
?>
答案 3 :(得分:0)
我已经解决了这个问题:
我在原始脚本中的每个列出文件的末尾添加了此删除链接:
- < a href="delete.php?file='.$file_or_dir.'&dir=' . $dir . '"> Delete< /a>< br/>';
此链接将我带到下载脚本页面,如下所示:
<?php
ob_start();
$file = $_GET["file"];
$getDir = $_GET["dir"];
$dir = 'docs/' . $getDir . '';
$isFile = ($dir == "") ? 'docs/' . $file . '' : '' . $dir . '/' . $file . '';
if (is_file($isFile)){
if ($dir == "")
unlink('docs/' . $file . '');
else
unlink('' . $dir . '/' . $file . '');
echo '' . $file . ' deleted';
echo ' from ' . $dir . '';
}
else{
rmdir('' . $dir . '/' . $file . '');
echo '' . $dir . '/' . $file . ' deleted';}
header("Location: indexer.php?p=" . $getDir . "");
ob_flush();
?>
现在一切都很出色,谢谢大家的帮助和建议:)