目录列表有限制

时间:2010-06-28 15:55:13

标签: php file-management folderbrowserdialog

我正在尝试制作一个只列出文件夹中文件夹的脚本。问题是我有用户可以在他们的文件夹中创建文件夹,所以基本上我正在尝试做的是让用户管理他们的文件夹和存储文件......我的问题是我想制作php“认为“根文件夹是他们的主目录,他们不能高于他们的主目录。目前我的php函数没有这样做,它只显示目录的内容......如果用户上升一级又一级上升......等等......他可以浏览整个硬盘驱动。

function directoryList($path) {
    $dirStruct = array();
    if(is_dir($path)) {
        $handle = opendir($path);
        while(($file = readdir($handle)) !== false) {
            if(@opendir($path.$file)) {
                chdir($path.$file);
                $absolutepath = getcwd();
                $dirStruct[] = array('path' => $absolutepath.'\\', 'name'=>$file);
            }
        }
    }
    return $dirStruct;
}

2 个答案:

答案 0 :(得分:2)

不允许为用户提供绝对路径,而只允许它们指定相对于给定基本路径的路径。接下来,编写一个函数,删除相对路径的任何“/../”并且您是安全的(只要用户无法在服务器上创建链接......)。

如果你想变得漂亮,你可以将“..”与之前的元素相匹配(所以“a /../ b”会变成“b”,即“..”删除“a” )如果之前没有路径元素,则忽略“..”。

答案 1 :(得分:0)

以下是一些可以扩展的内容:

function listFolders($folderPath, $homeFolder)
{
    $folderPath = realpath($folderPath);
    $homeFolder = realpath($homeFolder);
    if(strpos($folderPath, $homeFolder) === 0) {
        return glob("$folderPath/*", GLOB_ONLYDIR);
    }
}

$dirs = listFolders('/home/gordon/code/php', '/home/gordon');
print_r($dirs);

对于$folderPath,您传入要列出目录的文件夹。对于$homeFolder传递文件夹,您希望成为最顶层的文件夹。通过realpath两个路径,确保它们被解析为绝对路径。如果$folderPath低于$homeFolder,则$folderPath字符串将以#{1}}字符串开头并包含整个$homeFolder字符串。如果是这种情况,我们只需$folderPath $folderPath中的所有目录,并在数组中返回它们的绝对路径。


要从$homeFolder获取ltrim(str_replace('/home/gordon/', './', '/home/gordon/code/php/'), '/'); 的相对路径,只需执行

./code/php/

将返回{{1}}。


如果您想使用OOP执行此操作,您可能会对glob感兴趣。