使用 php fopen 读取文件和制作文件管理器时出现问题

Problem in reading files with php fopen and in making file manager

我正在尝试用 php 创建一个文件管理器,所以当我在浏览器中打开它时,它会给出当前目录的列表,并且可以使用 [=52 中的锚标记点击该文件=](到目前为止我已经这样做了),当文件被点击时,它会以文本模式打开它并显示文件中的任何源代码。

我面临两个无法解决的问题

问题 #1:

第一个问题是我想让我的文件管理器读取任何源代码,无论是图像还是 pdf,就像我发现的 tinyfilemanager here 这个杰作可以读取任何文件,即使你用记事本打开图像并在文件的最后插入一些 php 代码,它也会读取渲染,所以这是我的源代码:

<?php
function list_all_files($directory){
//opening the dir
    if($handle=opendir($directory.'/')){
        echo "looking inside '$directory'"."<br>";
    }

    while($file=readdir($handle)){
        //listing all the directories without ".." (dots)
        if($file!='.'&&$file!='..') {

            echo '<a href="Read.php?dir='.$directory.'&read='.$directory.'/'.$file.'">'.$file.'</a><br>';
        } //if ends here
    } //while loop endds here
} //list_all_files ends here


function read_file($file)
{
    $handle = fopen($file, "r");
    if ($handle) {
        while (($line = fgets($handle)) !== false) {
            echo($line);
        }
        fclose($handle);
    } else {
        echo "error opening the file";
    }
}


//main function
if(!isset($_GET['dir'])) {
    $dir='images';
}else{
    $dir=$_GET['dir'];
}

list_all_files($dir);

if(isset($_GET['read'])){
    $file1 = $_GET['read'];
    read_file($file1);
}

?>

我制作的上述程序也可以读取文件代码,但是当我单击任何包含 html 代码的 PHP 文件时,它只是显示它而不是在文本模式下提供其​​源代码, 下图:

不仅如此,如果我使用记事本在图像文件的最后放置一些 php 代码,它也不会显示。检查这个:

我做了很多研究,为什么我的代码不工作,而 tinyFilemanager 对上述任何情况都很完美,我发现每当我通过浏览器执行页面文件时,它默认使用这个

header("Content-Type: text/html");

所以如果我想做我想做的事,那么我将不得不使用这个:

header("Content-Type: text/x-php");

涵盖了上述两种情况,但导致了第二个问题。

问题 #2:

<?php
function list_all_files($directory){
//opening the dir
if($handle=opendir($directory.'/')){
echo "looking inside '$directory'"."<br>";
}

while($file=readdir($handle)){
    //listing all the directories without ".." (dots)
    if($file!='.'&&$file!='..') {

    echo '<a href="Read.php?dir='.$directory.'&read='.$directory.'/'.$file.'">'.$file.'</a><br>';
            } //if ends here
        } //while loop endds here
} //list_all_files ends here


function read_file($file)
{
    $handle = fopen($file, "r");
    if ($handle) {
        while (($line = fgets($handle)) !== false) {
            echo($line);
        }
        fclose($handle);
    } else {
       echo "error opening the file";
    }
}


//main function
if(!isset($_GET['dir'])) {
    $dir=getcwd();
}else{
    $dir=$_GET['dir'];
}

//listing all the directories and files in text/html format so that our anchor tag would be available.
ob_start();
header('Content-Type: text/html; charset=UTF-8');
list_all_files($dir);
ob_end_flush();



if(isset($_GET['read'])){
//changing the header to text/php-x so that the php code in any jpg file can be viewed clearly
    ob_clean();
    header('Content-Type: text/x-php; charset=UTF-8');
    ob_start();
    $file1 = $_GET['read'];
    read_file($file1);
    ob_end_flush();
}

?>

上面的代码工作得很好,但是有一个问题。因为它的内容类型不再是 text/html,所以它不会在网页上显示 html 内容。这是好的,但同时也是坏的,因为那样我就不会得到锚标记形式的目录列表,因为我认为 ob_start 和 ob_end_flush()。如果我使用这两个,它只会通过为每个函数分别创建一个缓冲区并执行它来解决问题。所以当它执行时,上面的函数将以内容类型 text/html 呈现,并显示带有锚标记的目录列表,而第二个将只是在 text/x-php 中,这将解决上述两种情况, 但我错了。

感谢大神的帮助和kikoSoftware在评论中的建议,问题解决了,函数名show_source(); ,它需要两个参数,但是第二个参数是可选的,因此我们不需要使用 header() 函数进行归档或发送内容类型响应,我们可以只使用该函数,源代码如下。

<?php
function list_all_files($directory){
//opening the dir
    if($handle=opendir($directory.'/')){
        echo "looking inside '$directory'"."<br>";
    }

    while($file=readdir($handle)){
        //listing all the directories without ".." (dots)
        if($file!='.'&&$file!='..') {

            echo '<a href="Read.php?dir='.$directory.'&read='.$directory.'/'.$file.'">'.$file.'</a><br>';
        } //if ends here
    } //while loop endds here
} //list_all_files ends here


function read_file($file)
{
    $handle = fopen($file, "r");
    if ($handle) {
        while (($line = fgets($handle)) !== false) {
            echo($line);
        }
        fclose($handle);
    } else {
        echo "error opening the file";
    }
}


//main function
if(!isset($_GET['dir'])) {
    $dir=getcwd();
}else{
    $dir=$_GET['dir'];
}

//listing all the directories and files in text/html format so that our anchor tag would be available.
list_all_files($dir);




if(isset($_GET['read'])){
//changing the header to text/php-x so that the php code in any jpg file can be viewed clearly

    $file1 = $_GET['read'];
    show_source($file1);
}

?>

感谢你们的帮助♥