You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改PHP视频画廊代码使其支持读取子文件夹内的视频文件

问题原因

  1. 原代码中basename($vid)仅提取视频文件名,丢失了子文件夹路径,导致视频资源路径错误
  2. 不同系统环境下glob的**通配符对多层目录的匹配支持兼容性不足,容易出现匹配失效的问题

推荐解决方案(不限子目录层数,兼容性好)

直接使用PHP内置的递归目录迭代器实现全目录扫描,完整代码如下:

<body>
  <div id="vid-gallery"><?php
    // 定义视频存储根目录
    $galleryRoot = __DIR__ . DIRECTORY_SEPARATOR . "gallery" . DIRECTORY_SEPARATOR;
    // 允许的视频格式后缀
    $allowExt = ['webm', 'mp4', 'ogg'];
    $videoList = [];

    // 递归扫描所有子目录的文件
    $dirIterator = new RecursiveDirectoryIterator($galleryRoot);
    $fileIterator = new RecursiveIteratorIterator($dirIterator);
    foreach ($fileIterator as $file) {
      // 过滤符合格式的视频文件
      if ($file->isFile() && in_array(strtolower($file->getExtension()), $allowExt)) {
        // 生成相对于gallery目录的路径,统一用正斜杠适配web标准
        $relativePath = substr($file->getPathname(), strlen($galleryRoot));
        $videoList[] = str_replace(DIRECTORY_SEPARATOR, '/', $relativePath);
      }
    }

    // 输出所有视频
    if (count($videoList) > 0) {
      foreach ($videoList as $path) {
        // 加controls属性可直接显示播放控件,不需要可删除
        printf("<video src='gallery/%s' controls></video>", rawurlencode($path));
      }
    }
  ?></div>
</body>

备选方案(保留glob写法,最多支持4层子目录)

如果坚持使用glob实现固定层数扫描,修改如下:

<?php
// 匹配最多4层子目录下的视频文件
$videos = glob(__DIR__ . "/gallery/{,*/,*/*/,*/*/*/,*/*/*/*/}*.{webm,mp4,ogg}", GLOB_BRACE);

if (count($videos) > 0) {
  foreach ($videos as $vid) {
    // 提取相对于gallery的路径,替换绝对路径前缀
    $relativePath = str_replace(__DIR__ . "/gallery/", "", $vid);
    printf("<video src='gallery/%s'></video>", rawurlencode($relativePath));
  }
}
?>

内容的提问来源于stack exchange,提问作者theunfortunatepanda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 00:00:01