内部环境的服务资源下载页面有访问需求,给开发和产品人员编写一个简洁的下载页面提供资源下载。直接用nginx+php的形式去编写了,这里提供展示index.php文件代码如下:
<?php
// 配置常量
define('BASE_DIR', __DIR__); // 当前脚本所在目录作为根目录
define('ALLOWED_DIR', realpath(BASE_DIR)); // 安全校验路径// 处理文件下载
if (isset($_GET['download'])) {$filePath = realpath($_GET['download']);if ($filePath && strpos($filePath, ALLOWED_DIR) === 0 && is_file($filePath)) {header('Content-Type: application/octet-stream');header('Content-Disposition: attachment; filename="' . basename($filePath) . '"');header('Content-Length: ' . filesize($filePath));readfile($filePath);exit;} else {die('<div class="p-4 text-red-500">文件不存在或禁止访问</div>');}
}// 获取当前安全目录路径
$currentDir = isset($_GET['dir']) ? realpath($_GET['dir']) : ALLOWED_DIR;
if (!$currentDir || strpos($currentDir, ALLOWED_DIR) !== 0) {$currentDir = ALLOWED_DIR; // 非法路径重置为根目录
}// 获取文件列表
$files = scandir($currentDir);
$fileList = [];
foreach ($files as $file) {if ($file == '.' || $file == '..') continue;$fullPath = $currentDir . DIRECTORY_SEPARATOR . $file;$fileList[] = ['name' => $file,'type' => is_dir($fullPath) ? 'directory' : 'file','size' => is_file($fullPath) ? formatSize(filesize($fullPath)) : '-','mtime' => date('Y-m-d H:i:s', filemtime($fullPath)),'path' => $fullPath];
}// 辅助函数:格式化文件大小
function formatSize($bytes) {$units = ['B', 'KB', 'MB', 'GB'];$index = 0;while ($bytes >= 1024 && $index < 3) {$bytes /= 1024;$index++;}return round($bytes, 2) . ' ' . $units[$index];
}
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>文件管理系统</title><script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="p-8 bg-gray-50"><div class="max-w-4xl mx-auto bg-white rounded-lg shadow-md p-6"><h1 class="text-2xl font-bold text-gray-800 mb-6">文件列表: <?= htmlspecialchars(str_replace(ALLOWED_DIR, '/', $currentDir)) ?></h1><!-- 面包屑导航(仅在非根目录显示) --><nav class="mb-4 text-sm text-gray-600"><?php$parentDir = dirname($currentDir);if ($currentDir !== ALLOWED_DIR && $parentDir != $currentDir && strpos(realpath($parentDir), ALLOWED_DIR) === 0):?><a href="?dir=<?= urlencode($parentDir) ?>" class="text-blue-500 hover:text-blue-700">⬆ 上一级</a><?php endif; ?></nav><!-- 文件表格 --><table class="w-full border-collapse"><thead class="bg-gray-50"><tr><th class="p-3 text-left text-gray-500">名称</th><th class="p-3 text-left text-gray-500">类型</th><th class="p-3 text-left text-gray-500">大小</th><th class="p-3 text-left text-gray-500">修改时间</th><th class="p-3 text-left text-gray-500">操作</th></tr></thead><tbody><?php foreach ($fileList as $item): ?><tr class="hover:bg-gray-50 border-t"><td class="p-3"><?php if ($item['type'] == 'directory'): ?><a href="?dir=<?= urlencode($item['path']) ?>" class="text-blue-500 hover:text-blue-700 flex items-center">📁 <?= htmlspecialchars($item['name']) ?></a><?php else: ?><span class="flex items-center">📄 <?= htmlspecialchars($item['name']) ?></span><?php endif; ?></td><td class="p-3 text-gray-600"><?= $item['type'] == 'directory' ? '文件夹' : '文件' ?></td><td class="p-3 text-gray-600"><?= $item['size'] ?></td><td class="p-3 text-gray-600"><?= $item['mtime'] ?></td><td class="p-3"><?php if ($item['type'] == 'file'): ?><a href="?download=<?= urlencode($item['path']) ?>" class="px-3 py-1 bg-blue-500 text-white rounded hover:bg-blue-600 transition-colors">下载</a><?php else: ?><span class="text-gray-400">-</span><?php endif; ?></td></tr><?php endforeach; ?></tbody></table></div>
</body>
</html>
最终的页面展示: