如何 link 和使用 php 浏览子目录
How to link and browse sub directories using php
我想使用 PHP 制作一个简单的文件浏览器。
因为我是 PHP 的新人。我需要一些推动,
<table class="table">
<thead>
<tr>
<th scope="col">Directory Name</th>
<th scope="col">Last Modified</th>
<th scope="col">Size</th>
</tr>
</thead>
<tbody>
<?php
$folders= new DirectoryIterator(__DIR__);
while($folders->valid()){
?>
<tr>
<td><?php echo "<a href='{$folders->current()}'>{$folders->current()}</a>" ?></td>
<td></td>
<td><?php echo $folders->getSize();?></td>
</tr>
<?php
$folders->next();
} ?>
</tbody>
</table>
到此为止。
我怎样才能完成该代码,以便使用 php 拥有一个功能文件浏览器。
谢谢。
这是一种方法,它也采用了一定程度的安全性。虽然这可能只是一个学校项目或教程,但您应该始终考虑安全性。我在下面发表了评论,但基本上这就是正在发生的事情。
您首先设置一个 $rootDirectory
(您必须对其进行修改 - 这个设置为我的文件系统)。 rootDirectory 是你允许浏览器走的最远的地方——因为如你所见,每个 folder/file 列表顶部的小 ..
link 允许向上目录遍历和任何人都可以自行导航到您不想公开的内容。
列出的文件夹的 links 被修改为从根目录传递到该文件夹的路径。这样就没有人可以将 link 伪造到某个内部 OS 文件夹。 links 在 GET
变量 (?dir=/some/path/
) 中沿此路径传递。当页面加载时,它会查找 GET
变量,将根目录添加到开头并进行几次检查以确保它是一个真实目录,它不在我们的 rootDirectory 之外,等等. 我们首先用 realpath()
转换它。传入的 dir
变量可能是 /myRootDirectory/../../../etc/mySecretConfigFile.conf
,它将通过我们的检查,因为它包含根目录。 realpath()
删除所有这些 ../
所以我们可以使用它。
<table class="table">
<thead>
<tr>
<th scope="col">Directory Name</th>
<th scope="col">Last Modified</th>
<th scope="col">Size</th>
</tr>
</thead>
<tbody>
<?php
// simple security - do not allow the file browser to get out of this root directory
// SET THIS FOR YOUR SYSTEM
$rootDirectory = '/Users/laphona/Sites/htdocs';
// $dir = __DIR__ ;
if ($_GET && $_GET['dir']) $dir = $rootDirectory . $_GET['dir'];
else $dir = $rootDirectory;
$dir = realpath($dir) ; // this takes out the ../ and the ./ and the .. that makes upward traversal possible despite our checks
// if our root directory isn't present in the $dir
if (strpos($dir, $rootDirectory) === false ) $dir = $rootDirectory ;
// if our root directory isn't the very first part of the $dir
if (strpos($dir, $rootDirectory) !== 0 ) $dir = $rootDirectory ;
$folders= new DirectoryIterator($dir);
while($folders->valid()){
// set up the path here to be the direct path to the folder, minus our root directory
$myPath = str_replace($rootDirectory, '', $folders->getPath()) . "/" . $folders->current();
$myItem = "<a href='".$_SERVER['PHP_SELF']."?dir={$myPath}'>{$folders->current()}</a>" ;
// if it's a file just present the name, no link
if ($folders->isFile()) $myItem = $folders->current();
?>
<tr>
<td><?php echo $myItem ?></td>
<td></td>
<td><?php echo $folders->getSize();?></td>
</tr>
<?php
$folders->next();
} ?>
</tbody>
</table>
严格的安全基本路径,带后退的文件夹导航,带文件内容视图的文件导航。 DIV 布局,没有 JavaScript 和简单 PHP.
<?php
$Script = basename(__FILE__);
$RootPath = "F:\Web";
$FileHTML = [];
$Path = realpath("" . (isset($_GET["Path"]) ? $_GET["Path"] : $RootPath) . "" . (isset($_GET["Folder"]) ? "/{$_GET["Folder"]}" : null));
if(substr($Path, 0, strlen($RootPath)) !== $RootPath)$Path = $RootPath;
foreach(scandir($Path) as $Item)if($Item != "." && ($Path != $RootPath || $Item != "..")){
$ItemWithPath = "{$Path}/{$Item}";
if(is_dir($ItemWithPath)){
$FolderHTML[] = "<div class=\"Item\"><a href=\"./{$Script}?Path={$Path}&Folder={$Item}\" class=\"Link\">{$Item}</a></div>";
}
else{
//$FileHTML[] = "<div class=\"Item\"><a href=\"./{$Script}?Path={$Path}&Folder=.&{$Item}&File={$Item}\" class=\"Link\">{$Item}</a><span class=\"Size\">" . round(filesize($ItemWithPath) / 1024, 0) . " KB</span><span class=\"ModificationTime\">" . date("Y-m-d H:i:s", filemtime($ItemWithPath)) . " KB</span></div>";
$FileHTML[] = "<tr class=\"Item\"><td><a href=\"./{$Script}?Path={$Path}&Folder=.&{$Item}&File={$Item}\" class=\"Link\">{$Item}</a></td><td class=\"Size\">" . round(filesize($ItemWithPath) / 1024, 0) . " KB</td><td class=\"ModificationTime\">" . date("Y-m-d H:i:s", filemtime($ItemWithPath)) . "</td></tr>";
}
}
?><html>
<head>
<style>
body{margin: 0; font-family: Verdana, Tahoma, Arial; font-size: 12px;}
body:after{display: block; clear: both; content: '';}
div{box-sizing: border-box;}
.Navigation{float: left; width: 33%;}
.Navigation > .CurrentPath{border: 1px Black solid; background: rgba(0, 255, 255, 0.25); padding: 5px;}
.Navigation > .FolderList{height: calc(50% - 1em - 12px); border: 1px Grey solid; overflow-y: auto;}
.Navigation > .FolderList > .Item{padding: 5px;}
.Navigation > .FolderList > .Item:hover{background: rgba(255, 255, 0, 0.5);}
.Navigation > .FolderList > .Item > .Link{text-decoration: none;}
.Navigation > .FileList{height: 50%; border: 1px Grey solid; overflow-y: auto;}
.Navigation > .FileList > table{font-size: inherit;}
.Navigation > .FileList > table > tbody > .Item{}
.Navigation > .FileList > table > tbody > .Item:hover{background: rgba(255, 255, 0, 0.5);}
.Navigation > .FileList > table > tbody > .Item > td{padding: 5px;}
.Navigation > .FileList > table > tbody > .Item > td > .Link{text-decoration: none;}
.Navigation > .FileList > table > tbody > .Item > .Size{margin-left: 2em; white-space: nowrap;}
.Navigation > .FileList > table > tbody > .Item > .ModificationTime{margin-left: 2em;}
.FileContent{float: left; width: 67%;}
.FileContent > .FileName{border: 1px Black solid; background: rgba(255, 0, 255, 0.25); padding: 5px;}
.FileContent > .Content{height: calc(100% - 1em - 12px); background: Black; padding: 5px; color: White; white-space: pre;}
</style>
</head>
<body>
<div class="Navigation">
<div class="CurrentPath"><?=$Path?></div>
<div class="FolderList">
<?=implode("\n ", $FolderHTML) . "\n"?>
</div>
<div class="FileList">
<table>
<tbody>
<?=implode("\n ", $FileHTML) . "\n"?>
</tbody>
</table>
</div>
</div>
<div class="FileContent">
<div class="FileName"><?=isset($_GET["File"]) ? $_GET["File"] : null?></div>
<div class="Content"><?=isset($_GET["File"]) ? file_get_contents("{$Path}/{$_GET["File"]}") : null?></div>
</div>
</body>
</html>
我想使用 PHP 制作一个简单的文件浏览器。 因为我是 PHP 的新人。我需要一些推动,
<table class="table">
<thead>
<tr>
<th scope="col">Directory Name</th>
<th scope="col">Last Modified</th>
<th scope="col">Size</th>
</tr>
</thead>
<tbody>
<?php
$folders= new DirectoryIterator(__DIR__);
while($folders->valid()){
?>
<tr>
<td><?php echo "<a href='{$folders->current()}'>{$folders->current()}</a>" ?></td>
<td></td>
<td><?php echo $folders->getSize();?></td>
</tr>
<?php
$folders->next();
} ?>
</tbody>
</table>
到此为止。 我怎样才能完成该代码,以便使用 php 拥有一个功能文件浏览器。 谢谢。
这是一种方法,它也采用了一定程度的安全性。虽然这可能只是一个学校项目或教程,但您应该始终考虑安全性。我在下面发表了评论,但基本上这就是正在发生的事情。
您首先设置一个 $rootDirectory
(您必须对其进行修改 - 这个设置为我的文件系统)。 rootDirectory 是你允许浏览器走的最远的地方——因为如你所见,每个 folder/file 列表顶部的小 ..
link 允许向上目录遍历和任何人都可以自行导航到您不想公开的内容。
列出的文件夹的 links 被修改为从根目录传递到该文件夹的路径。这样就没有人可以将 link 伪造到某个内部 OS 文件夹。 links 在 GET
变量 (?dir=/some/path/
) 中沿此路径传递。当页面加载时,它会查找 GET
变量,将根目录添加到开头并进行几次检查以确保它是一个真实目录,它不在我们的 rootDirectory 之外,等等. 我们首先用 realpath()
转换它。传入的 dir
变量可能是 /myRootDirectory/../../../etc/mySecretConfigFile.conf
,它将通过我们的检查,因为它包含根目录。 realpath()
删除所有这些 ../
所以我们可以使用它。
<table class="table">
<thead>
<tr>
<th scope="col">Directory Name</th>
<th scope="col">Last Modified</th>
<th scope="col">Size</th>
</tr>
</thead>
<tbody>
<?php
// simple security - do not allow the file browser to get out of this root directory
// SET THIS FOR YOUR SYSTEM
$rootDirectory = '/Users/laphona/Sites/htdocs';
// $dir = __DIR__ ;
if ($_GET && $_GET['dir']) $dir = $rootDirectory . $_GET['dir'];
else $dir = $rootDirectory;
$dir = realpath($dir) ; // this takes out the ../ and the ./ and the .. that makes upward traversal possible despite our checks
// if our root directory isn't present in the $dir
if (strpos($dir, $rootDirectory) === false ) $dir = $rootDirectory ;
// if our root directory isn't the very first part of the $dir
if (strpos($dir, $rootDirectory) !== 0 ) $dir = $rootDirectory ;
$folders= new DirectoryIterator($dir);
while($folders->valid()){
// set up the path here to be the direct path to the folder, minus our root directory
$myPath = str_replace($rootDirectory, '', $folders->getPath()) . "/" . $folders->current();
$myItem = "<a href='".$_SERVER['PHP_SELF']."?dir={$myPath}'>{$folders->current()}</a>" ;
// if it's a file just present the name, no link
if ($folders->isFile()) $myItem = $folders->current();
?>
<tr>
<td><?php echo $myItem ?></td>
<td></td>
<td><?php echo $folders->getSize();?></td>
</tr>
<?php
$folders->next();
} ?>
</tbody>
</table>
严格的安全基本路径,带后退的文件夹导航,带文件内容视图的文件导航。 DIV 布局,没有 JavaScript 和简单 PHP.
<?php
$Script = basename(__FILE__);
$RootPath = "F:\Web";
$FileHTML = [];
$Path = realpath("" . (isset($_GET["Path"]) ? $_GET["Path"] : $RootPath) . "" . (isset($_GET["Folder"]) ? "/{$_GET["Folder"]}" : null));
if(substr($Path, 0, strlen($RootPath)) !== $RootPath)$Path = $RootPath;
foreach(scandir($Path) as $Item)if($Item != "." && ($Path != $RootPath || $Item != "..")){
$ItemWithPath = "{$Path}/{$Item}";
if(is_dir($ItemWithPath)){
$FolderHTML[] = "<div class=\"Item\"><a href=\"./{$Script}?Path={$Path}&Folder={$Item}\" class=\"Link\">{$Item}</a></div>";
}
else{
//$FileHTML[] = "<div class=\"Item\"><a href=\"./{$Script}?Path={$Path}&Folder=.&{$Item}&File={$Item}\" class=\"Link\">{$Item}</a><span class=\"Size\">" . round(filesize($ItemWithPath) / 1024, 0) . " KB</span><span class=\"ModificationTime\">" . date("Y-m-d H:i:s", filemtime($ItemWithPath)) . " KB</span></div>";
$FileHTML[] = "<tr class=\"Item\"><td><a href=\"./{$Script}?Path={$Path}&Folder=.&{$Item}&File={$Item}\" class=\"Link\">{$Item}</a></td><td class=\"Size\">" . round(filesize($ItemWithPath) / 1024, 0) . " KB</td><td class=\"ModificationTime\">" . date("Y-m-d H:i:s", filemtime($ItemWithPath)) . "</td></tr>";
}
}
?><html>
<head>
<style>
body{margin: 0; font-family: Verdana, Tahoma, Arial; font-size: 12px;}
body:after{display: block; clear: both; content: '';}
div{box-sizing: border-box;}
.Navigation{float: left; width: 33%;}
.Navigation > .CurrentPath{border: 1px Black solid; background: rgba(0, 255, 255, 0.25); padding: 5px;}
.Navigation > .FolderList{height: calc(50% - 1em - 12px); border: 1px Grey solid; overflow-y: auto;}
.Navigation > .FolderList > .Item{padding: 5px;}
.Navigation > .FolderList > .Item:hover{background: rgba(255, 255, 0, 0.5);}
.Navigation > .FolderList > .Item > .Link{text-decoration: none;}
.Navigation > .FileList{height: 50%; border: 1px Grey solid; overflow-y: auto;}
.Navigation > .FileList > table{font-size: inherit;}
.Navigation > .FileList > table > tbody > .Item{}
.Navigation > .FileList > table > tbody > .Item:hover{background: rgba(255, 255, 0, 0.5);}
.Navigation > .FileList > table > tbody > .Item > td{padding: 5px;}
.Navigation > .FileList > table > tbody > .Item > td > .Link{text-decoration: none;}
.Navigation > .FileList > table > tbody > .Item > .Size{margin-left: 2em; white-space: nowrap;}
.Navigation > .FileList > table > tbody > .Item > .ModificationTime{margin-left: 2em;}
.FileContent{float: left; width: 67%;}
.FileContent > .FileName{border: 1px Black solid; background: rgba(255, 0, 255, 0.25); padding: 5px;}
.FileContent > .Content{height: calc(100% - 1em - 12px); background: Black; padding: 5px; color: White; white-space: pre;}
</style>
</head>
<body>
<div class="Navigation">
<div class="CurrentPath"><?=$Path?></div>
<div class="FolderList">
<?=implode("\n ", $FolderHTML) . "\n"?>
</div>
<div class="FileList">
<table>
<tbody>
<?=implode("\n ", $FileHTML) . "\n"?>
</tbody>
</table>
</div>
</div>
<div class="FileContent">
<div class="FileName"><?=isset($_GET["File"]) ? $_GET["File"] : null?></div>
<div class="Content"><?=isset($_GET["File"]) ? file_get_contents("{$Path}/{$_GET["File"]}") : null?></div>
</div>
</body>
</html>