将..转换为真实目录PHP

时间:2011-12-28 13:46:04

标签: php javascript directory scandir

我正在使用PHP和Javascript制作一个小文件浏览脚本,我遇到了一个小问题。当当前目录位于基础中时,当前目录作为GET存储为index.php?dir=/projects/jphp。然后我使用:

将其存储在变量$scandir
$scandir = $_GET['dir'];

因为fiels列在一个表中,所以用户可以看到它们,文件夹是这样的超链接:

<td><a style="color: red;" href="edit.php?pid=<?php echo $project['id'] ?>&dir=<?php echo $scandir . "/" . $thisfile; ?>"><?php echo $thisfile; ?></a></td>

变量$thisfile使用foreach()循环填充,该循环遍历目录中的每个文件。
当用户开始浏览文件夹和文件时,文件地址变得混乱,例如,在浏览文件一分钟后,$_GET['dir'];看起来像

projects/jphp/js/../js/../../../projects/jphp

有没有办法保持路径简单,因为上面的路径与

完全相同
projects/jphp

如果你知道如何将顶部隐藏到底部,那就太棒了,谢谢!我可能没有解释得这么好,所以让我知道你我没有意义。

2 个答案:

答案 0 :(得分:2)

函数realpath()可以满足您的需求。如果您没有收到任何结果,请检查您的文件夹权限:

The running script must have executable permissions 
on all directories in the hierarchy, otherwise 
realpath() will return FALSE.

答案 1 :(得分:0)

我认为您可以使用&dir=/some/path/../替换&dir=/some/之类的链接,因此只需链接到/some/path/../,而不是/some/,它们是相同的。

<强> UPD:

例如:

<?php
$dir = $scandir;
if( $dir=='..' ){
    if( $scandir=='' || $scandir=='/' ){
        // skip this entry using continue or something else
    }
    if( substr($scandir,-1)=='/' ){
        $dir = dirname(substr($scandir,0,-1)).'/';        
    }else{
        $dir = dirname($scandir).'/';
    }
    if( $dir=='' ){
        $dir = '/';
    }
}else{
    $dir = $scandir.'/'.$thisfile;
}
?>
<td><a style="color: red;" href="edit.php?pid=<?php echo $project['id'] ?>&dir=<?php echo $dir; ?>"><?php echo $thisfile; ?></a></td>