如何修改PHP视频画廊代码使其支持读取子文件夹内的视频文件
问题原因
- 原代码中
basename($vid)仅提取视频文件名,丢失了子文件夹路径,导致视频资源路径错误 - 不同系统环境下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
相关产品推荐
相关产品推荐

