You need to enable JavaScript to run this app. PHP如何用opendir()生成/C:/user下仅目录可点击列表并展示子目录内文件
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.05 06:36:03