使用 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);
}
?>
感谢你们的帮助♥
我正在尝试用 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);
}
?>
感谢你们的帮助♥