此实现了一个可展开的目录列表和文件浏览功能
该代码通过PHP实现了扫描指定目录下的文件和目录,并按照一定的排序规则进行展示。
用户可以点击目录名称,展开或折叠该目录下的子目录和文件列表。
对于文件,显示了文件名、修改时间和文件大小,并提供了文件链接以在新标签页中打开文件。
对于空目录,显示了"Empty Directory"的提示。此外,代码还提供了文件大小格式化的函数,将文件大小转换为易读的单位(如KB、MB、GB等)。
该代码通过HTML、CSS和JavaScript实现,为网页添加了一种直观和友好的目录浏览方式,方便用户快速查找和访问文件。
<!DOCTYPE html>
<html>
<head>
<title>Directory Listing</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
body {
font-family: Arial, sans-serif;
margin: 20px;
}
.directory {
font-weight: bold;
margin-bottom: 10px;
cursor: pointer;
display: flex;
align-items: center;
}
.directory-icon {
margin-right: 5px;
}
.file {
margin-left: 20px;
display: flex;
align-items: center;
}
.indent {
margin-left: 20px;
}
.collapsed {
display: none;
}
.empty-directory {
background-color: #C0FFC0;
}
.table {
border-collapse: collapse;
}
td {
padding: 5px;
border: none;
}
.left {
text-align: left;
width: 250px; /* 调整大小文本的列宽 */
}
.center {
text-align: center;
width: 180px; /* 调整大小文本的列宽 */
}
.right {
text-align: right;
width: 110px; /* 调整大小文本的列宽 */
}
</style>
<script>
function toggleDirectory(element) {
var subDirectory = element.nextElementSibling;
if (subDirectory.style.display === 'none') {
subDirectory.style.display = 'block';
} else {
subDirectory.style.display = 'none';
}
}
</script>
</head>
<body>
<h2>Directory Listing</h2>
<table class="table">
<tr>
<td class="left">文件名</td>
<td class="center">Date 修改时间</td>
<td class="right">大小</td>
</tr>
</table>
<div style="width:650px;">
<hr>
<?php
function listDirectoriesAndFiles($dir, $indent = '') {
$result = '';
// 扫描当前目录下的文件和目录
$files = scandir($dir);
$directories = [];
$filesList = [];
foreach ($files as $file) {
if ($file === '.' || $file === '..') {
continue;
}
$filePath = $dir . '/' . $file;
if (is_dir($filePath)) {
// 如果是目录,将目录名添加到 $directories 数组
$directories[] = $file;
} else {
// 如果是文件,将文件名添加到 $filesList 数组
$filesList[] = $file;
}
}
// 对目录和文件列表进行排序
sort($directories);
sort($filesList);
// 输出目录列表
foreach ($directories as $directory) {
$subDirectoriesAndFiles = listDirectoriesAndFiles($dir . '/' . $directory, $indent . '<span class="indent"></span>');
$result .= '<div class="directory" onclick="toggleDirectory(this)">';
$result .= $indent . '<span class="directory-icon">📂</span>' . $directory . '->';
$result .= '</div>';
$result .= '<div class="collapsed">';
$result .= $subDirectoriesAndFiles;
$result .= '</div>';
}
$result .= '<table class="table file">';
// 输出文件列表
foreach ($filesList as $file) {
$filePath = $dir . '/' . $file;
$fileSize = filesize($filePath);
$fileSizeFormatted = formatFileSize($fileSize);
$fileModified = date("Y-m-d H:i:s", filemtime($filePath));
$result .= '<tr>';
$result .= '<td class="left"><a href="' . $filePath . '" target="_blank">' . $file . '</a></td>';
$result .= '<td class="center">' . $fileModified . '</td>';
$result .= '<td class="right">' . $fileSizeFormatted . '</td>';
$result .= '</tr>';
}
$result .= '</table>';
$result .= '<div style="border: 1px dashed green; width: 650px;"></div>';
if (empty($directories) && empty($filesList)) {
$result .= '<div class="file empty-directory">';
$result .= $indent . 'Empty Directory';
$result .= '</div>';
}
return $result;
}
function formatFileSize($size) {
$units = array('B', 'KB', 'MB', 'GB', 'TB');
$i = 0;
while ($size >= 1024 && $i < 4) {
$size /= 1024;
$i++;
}
return round($size, 2) . $units[$i];
}
// 获取当前目录路径
$dir = './';
// 获取当前目录下的所有目录和文件
$directoriesAndFiles = listDirectoriesAndFiles($dir);
// 输出目录和文件列表
echo $directoriesAndFiles;
?>
</div>
</body>
</html>
第二种使用div
<!DOCTYPE html>
<html>
<head>
<title>Directory Listing</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 20px;
}
.directory {
font-weight: bold;
margin-bottom: 10px;
cursor: pointer;
display: flex;
align-items: center;
}
.directory-icon {
margin-right: 5px;
}
.file {
margin-left: 20px;
}
.file a {
text-decoration: none;
color: #0000EE;
}
.file a:hover {
text-decoration: underline;
}
.indent {
margin-left: 20px;
}
.collapsed {
display: none;
}
.file-size {
margin-right: 50px;
}
</style>
<script>
function toggleDirectory(element) {
var subDirectory = element.nextElementSibling;
if (subDirectory.style.display === 'none') {
subDirectory.style.display = 'block';
} else {
subDirectory.style.display = 'none';
}
}
</script>
</head>
<body>
<h2>Index of /Directory Listing/</h2>
<div style="width:650px;">
<div class="file">
<span style="margin-right: 265px;">文件/文件夹</span>
<span style="margin-right: 95px;">大小</span>
<span class="file-modified" >Date 修改时间</span>
</div>
<hr>
<?php
function listDirectoriesAndFiles($dir, $indent = '') {
$result = '';
// 扫描当前目录下的文件和目录
$files = scandir($dir);
$directories = [];
$filesList = [];
foreach ($files as $file) {
if ($file === '.' || $file === '..') {
continue;
}
$filePath = $dir . '/' . $file;
if (is_dir($filePath)) {
// 如果是目录,将目录名添加到 $directories 数组
$directories[] = $file;
} else {
// 如果是文件,将文件名添加到 $filesList 数组
$filesList[] = $file;
}
}
// 对目录和文件列表进行排序
sort($directories);
sort($filesList);
// 输出目录列表
foreach ($directories as $directory) {
$result .= '<div class="directory" onclick="toggleDirectory(this)">';
$result .= $indent . '<span class="directory-icon">📂</span>' . $directory . '->';
$result .= '</div>';
$result .= '<div class="collapsed">';
$subDirectoriesAndFiles = listDirectoriesAndFiles($dir . '/' . $directory, $indent . '<span class="indent"></span>');
$result .= $subDirectoriesAndFiles;
$result .= '</div>';
}
// 输出文件列表
foreach ($filesList as $file) {
$filePath = $dir . '/' . $file;
$fileSize = filesize($filePath);
$fileSizeFormatted = formatFileSize($fileSize);
$fileModified = date("Y-m-d H:i:s", filemtime($filePath));
$result .= '<div class="file">' . $indent . '<a href="' . $filePath . '" target="_blank">' . $file . '</a>';
$result .= '<span style="float: right;">' . $fileModified . '</span>';
$result .= '<span class="file-size" style="float: right;">' . $fileSizeFormatted . '</span>';
$result .= '</div>';
}
$result .= '<br>';
return $result;
}
function formatFileSize($size) {
$units = array('B', 'KB', 'MB', 'GB', 'TB');
$i = 0;
while ($size >= 1024 && $i < 4) {
$size /= 1024;
$i++;
}
return round($size, 2) . $units[$i];
}
// 获取当前目录路径
$dir = './';
// 获取当前目录下的所有目录和文件
$directoriesAndFiles = listDirectoriesAndFiles($dir);
// 输出目录和文件列表
echo $directoriesAndFiles;
?>
</div>
</body>
</html>