PHP中的文件树/查看器-文件不会打开,除非它们位于基本目录中


File Tree / Viewer in PHP - files won't open unless they are in the base directory

我已经搜索了很多东西,我似乎找不到一个简单的解决方案来解决我的问题。

我在我们的网站上使用PHP文件树,因为它非常漂亮,是我能找到的唯一简单的树视图。然而,我现在遇到的问题是,我实际上可以打开的唯一文件必须在根级别。因此,如果它是我想打开的子文件夹中的文件,我会得到一个"not found"错误,其中url类似于"~/users/blah/root/file.txt",而不是"~/users/blah/root/subfolder/file.txt"。

调用很简单:

echo php_file_tree(REALPATH."support");

和执行重要工作的函数部分(基本上是问题所在)是

        foreach( $file as $this_file ) {
        if( $this_file != "." && $this_file != ".." ) {
            if( is_dir("$directory/$this_file") ) {
                // Directory
                $php_file_tree .= "<li class='"pft-directory'"><a href='"#'">" . htmlspecialchars($this_file) . "</a>";
                $php_file_tree .= php_file_tree_dir("$directory/$this_file", $return_link ,$extensions, false);
                $php_file_tree .= "</li>";
            } else  {
                // File
                $link = $directory."/".$this_file;
                // Get extension (prepend 'ext-' to prevent invalid classes from extensions that begin with numbers)
                $ext = "ext-" . substr($this_file, strrpos($this_file, ".") + 1); 
                    $php_file_tree .= "<li class='"pft-file " . strtolower($ext) . "'"><a href=".$this_file."'">" . htmlspecialchars($this_file) . "</a></li>";
                }
        }
    }

在原始代码中,$link用于href;然而,我遇到了这个问题,因为它使用了一个绝对路径到我正在使用的staging站点上不存在的路径。因此,使用$this_file,文件将打开,但我知道这是不正确的,因为else之前的if语句负责文件夹。但是,$link实际上包含了子文件夹,因为它调用了它需要的目录。

是否有办法结合这两个,基本上,所以我可以传递子文件夹作为文件名的一部分,在href中,它将能够打开?以前有人遇到过这样的问题吗?

整个设置需要是动态的,因此不需要硬编码路径。管理员将能够根据需要删除和添加文件夹和文件。市面上有很多文件浏览器,但它们都不像这个树形视图那么简单,而且我还是php和jQuery的新手,所以有一半的时间我都不明白是怎么回事。然而,我得到这个,但我不知道如何修复。

任何帮助都将非常感激!

编辑:我得到它的行为正确的唯一时间是当我基本上设置url在函数;然而,这只在我的本地机器上工作,因为我知道它的路径。服务器是不同的,我不知道如何找到路径!

您需要在所有文件路径操作中包含$directory。你的else条款中缺少:

 $php_file_tree .= "..snip..."'"><a href='"$directory/$this_file'">" ...snip...
                                           ^^^^^^^^^^^--missing

现在你正在构建一个树状列表,对于像foo/bar/baz/file.txt这样的文件,你最终生成

 <li><a href="file.txt">foo/bar/baz/file.txt</a>

当点击该链接时,您将在与脚本本身相同的目录中寻找file.txt,例如http://example.com/script.php将链接到http://example.com/file.txt,而不是您想要的http://example.com/foo/bar/baz/file.txt