PHP如何判断文件是否为视频

来源:编程学习作者:又改需求头衔:程序员
导读:本期聚焦于小伙伴创作的《PHP如何判断文件是否为视频》,敬请观看详情。在PHP开发中,经常需要判断上传的文件是否为合法的视频文件,避免非视频文件占用存储资源或者带来安全风险。常见的判断方式包括通过文件扩展名检测、读取文件MIME类型、分析文件二进制头信息等方法。不同的检测方式有不同的适用场景和局限性,比如扩展名检测容易被伪造,MIME类型检测相对可靠但也可能被篡改,二进制头检测则准确率更高但实现复杂度稍大。本文将详细介绍几种主流的PHP视频文件检测方法,分析各自的优缺点,并给出可直接复用的代码示例,帮助开发者根据实际需求选择合适的检测方案。

在PHP项目中处理文件上传或者文件校验场景时,判断一个文件是否为视频文件是常见需求,下面介绍几种常用的检测方式。

PHP如何判断文件是否为视频

方法一:通过文件扩展名判断

这种方式是最简单的检测方式,通过获取文件的后缀名,和预设的视频扩展名列表做匹配,不过这种方式很容易被伪造,只能作为初步筛选。

<?php
/**
 * 通过扩展名判断是否为视频文件
 * @param string $filePath 文件路径
 * @return bool
 */
function isVideoByExtension($filePath) {
    // 常见视频扩展名列表
    $videoExtensions = ['mp4', 'avi', 'mov', 'mkv', 'flv', 'wmv', 'rmvb', '3gp', 'webm'];
    // 获取文件扩展名并转为小写
    $extension = strtolower(pathinfo($filePath, PATHINFO_EXTENSION));
    return in_array($extension, $videoExtensions);
}

// 测试示例
$testFile = 'test.mp4';
var_dump(isVideoByExtension($testFile)); // 输出 bool(true)
?>

方法二:通过MIME类型判断

可以通过PHP的finfo扩展获取文件的MIME类型,视频文件的MIME类型通常以video/开头,这种方式比扩展名检测更可靠。

<?php
/**
 * 通过MIME类型判断是否为视频文件
 * @param string $filePath 文件路径
 * @return bool
 */
function isVideoByMime($filePath) {
    if (!file_exists($filePath)) {
        return false;
    }
    // 打开finfo资源
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    // 获取文件MIME类型
    $mimeType = finfo_file($finfo, $filePath);
    finfo_close($finfo);
    // 判断MIME类型是否以video/开头
    return strpos($mimeType, 'video/') === 0;
}

// 测试示例
$testFile = 'test.mp4';
var_dump(isVideoByMime($testFile)); // 输出 bool(true)
?>

方法三:结合扩展名和MIME类型双重校验

为了提升检测的准确性,可以将扩展名和MIME类型检测结合起来,同时校验两项都符合视频文件的特征,减少误判概率。

<?php
/**
 * 结合扩展名和MIME类型判断是否为视频文件
 * @param string $filePath 文件路径
 * @return bool
 */
function isVideoCombined($filePath) {
    if (!file_exists($filePath)) {
        return false;
    }
    // 扩展名校验
    $videoExtensions = ['mp4', 'avi', 'mov', 'mkv', 'flv', 'wmv', 'rmvb', '3gp', 'webm'];
    $extension = strtolower(pathinfo($filePath, PATHINFO_EXTENSION));
    if (!in_array($extension, $videoExtensions)) {
        return false;
    }
    // MIME类型校验
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mimeType = finfo_file($finfo, $filePath);
    finfo_close($finfo);
    return strpos($mimeType, 'video/') === 0;
}

// 测试示例
$testFile = 'test.mp4';
var_dump(isVideoCombined($testFile)); // 输出 bool(true)
?>

三种方式对比

下面通过表格对比三种检测方式的特点,方便开发者根据场景选择:

检测方式实现难度准确率适用场景
扩展名检测仅做初步筛选,对安全性要求不高的场景
MIME类型检测普通文件上传校验场景
双重校验对文件合法性要求较高的上传场景

注意事项

  • 使用finfo扩展前需要确保PHP已经开启该扩展,大部分默认环境已经开启,若未开启可以在php.ini中配置开启。
  • 如果上传的文件是用户伪造的,即使双重校验也可能存在漏判情况,若对安全性要求极高,可以结合视频解析库进一步校验文件内容是否可正常解析。
  • 检测前需要先判断文件是否存在,避免函数执行报错。

PHP视频文件检测MIME_typefile_info修改时间:2026-06-13 07:57:14

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。