PHP如何用opendir()生成/C:/user下仅目录可点击列表并展示子目录内文件
功能实现方案
核心逻辑拆解
对应需求匹配的实现环节:
- 严格按照要求使用
opendir()完成目录遍历,不强制依赖scandir() - 通过
is_dir()函数完成目录/文件的类型区分,实现分类筛选输出 - 用GET参数传递选中的目录信息,配合HTML的
target="_blank"实现新标签页打开 - 过滤系统默认的
...特殊目录项,避免无意义的输出
可直接运行的参考代码
<?php // 定义要遍历的根目录,Windows路径用正斜杠避免转义问题 $rootPath = 'C:/user'; // 校验根目录本身是否存在 if (!is_dir($rootPath)) { exit("指定的根目录不存在,请检查路径配置"); } // 判断是否通过链接传入了要查看的子目录 $showDir = isset($_GET['dir']) ? urldecode($_GET['dir']) : ''; $currentPath = $rootPath; // 如果有传入子目录,做合法性校验 if ($showDir !== '') { // 拼接成完整路径 $targetPath = $rootPath . DIRECTORY_SEPARATOR . $showDir; // 校验目标路径确实在根目录范围内,防止路径遍历攻击 $realRoot = realpath($rootPath); $realTarget = realpath($targetPath); if ($realTarget === false || strpos($realTarget, $realRoot) !== 0 || !is_dir($realTarget)) { exit("你访问的目录不存在或无权限查看"); } $currentPath = $realTarget; } ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>目录浏览</title> </head> <body> <h3>当前浏览路径:<?php echo htmlspecialchars($currentPath); ?></h3> <ul> <?php // 打开当前要遍历的目录句柄 $dirHandle = opendir($currentPath); // 循环读取目录下的所有项 while (($item = readdir($dirHandle)) !== false) { // 跳过系统默认的当前目录、上级目录 if ($item == '.' || $item == '..') continue; // 拼接完整的项路径,用于类型判断 $fullItemPath = $currentPath . DIRECTORY_SEPARATOR . $item; // 初始根目录浏览状态:仅输出目录项并生成可点击链接 if ($showDir === '') { if (is_dir($fullItemPath)) { // 生成链接,新标签打开,对目录名做urlencode避免特殊字符失效 $link = '?dir=' . urlencode($item); echo "<li><a href='$link' target='_blank'>" . htmlspecialchars($item) . " (目录)</a></li>"; } } else { // 进入子目录后的状态:展示目录内的所有文件/目录项 $type = is_dir($fullItemPath) ? '目录' : '文件'; echo "<li>" . htmlspecialchars($item) . " ($type)</li>"; } } // 关闭目录句柄 closedir($dirHandle); ?> </ul> </body> </html>
关键避坑提示
- 不要直接用
readdir()返回的文件名做类型判断:必须拼接成完整的绝对路径后再传给is_dir(),否则PHP会基于当前脚本的运行路径做匹配,大概率出现判断错误 - 必须做路径合法性校验:不能直接信任用户传入的
dir参数,否则攻击者可以手动修改参数加../路径片段,遍历非授权的服务器目录 - 输出内容用
htmlspecialchars()转义:如果文件名包含特殊HTML字符,不做转义会导致页面结构异常 - Windows路径统一用正斜杠
/:不用写转义的反斜杠,PHP会自动兼容Windows的路径解析规则
常见问题排查
- 如果打开目录提示无权限:需要确认PHP运行进程(Apache/Nginx/IIS对应的运行账号)有
C:/user目录的读取权限 - 如果中文目录链接失效:确认所有传递的目录名都用了
urlencode()编码,接收时用urldecode()解码,页面编码统一为UTF-8
内容的提问来源于stack exchange,提问作者cass
相关产品推荐
相关产品推荐

