目录列表与限制
问题描述:
我想制作一个脚本,只列出文件夹内的文件夹。问题是我的用户可以在他们的文件夹中创建文件夹,所以基本上我想要做的就是让用户管理他们的文件夹和存储文件......我的问题是我想让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;
}
答
而不是给用户一个绝对路径,只允许它们指定相对于给定基路径的路径。接下来,编写一个函数,删除相对路径的任何“/../”,并且您是安全的(只要用户无法在服务器上创建链接...)。
如果你想要很好,你可以匹配“..”和之前的元素(所以“a /../ b”会变成“b”,即“..”删除“a” “)或者如果在它之前没有路径元素,则忽略”..“。
答
这里是一个小东西,以扩大:你的文件夹中传递你想从列出的目录
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
字符串将以字符串开始并包含整个$homeFolder
字符串。如果是这种情况,我们只需glob
$folderPath
中的所有目录,并将它们的绝对路径返回到数组中。
要从$homeFolder
得到$folderPath
的相对路径,只是做
ltrim(str_replace('/home/gordon/', './', '/home/gordon/code/php/'), '/');
这将返回./code/php/
。
如果你想与OOP要做到这一点,你可能会感兴趣的SPL DirectoryIterator。
我假设“a /../ b”是一个正则表达式。是吗? – user253530 2010-06-28 16:07:15
不,“..”是父目录。 – 2010-06-29 07:09:36