php判断视频文件合法性需:①检查$_files['video']['error']===upload_err_ok;②用finfo_open(fileinfo_mime_type)读取真实mime类型,不信任$_files'video';③白名单校验如video/mp4、video/quicktime;④重命名存储并隔离路径,禁用原始文件名防注入。

PHP怎么判断上传的视频文件是否合法
别直接信任 $_FILES['video']['type'],浏览器可以伪造 MIME 类型,靠它验文件等于没验。真正靠谱的是用 finfo_open() 检查二进制头(magic number):
-
finfo_open(FILEINFO_MIME_TYPE)返回真实 MIME,比如"video/mp4"或"video/quicktime" - 注意:某些 .mov 文件可能被识别为
"video/quicktime"而非"video/mp4",需在白名单里一并允许 - 如果
finfo_open()报错"Failed to load magic database",说明系统没装 libmagic 或 PHP 未启用fileinfo扩展,运行php -m | grep fileinfo确认
PHP如何安全保存用户上传的视频文件
别用原始文件名直接存,也别把文件丢进 Web 可访问目录(如 ./uploads/),否则可能触发远程代码执行。
- 生成唯一文件名:用
uniqid() . '_' . random_int(1000, 9999),再拼上从finfo得到的扩展名(不是客户端传来的$_FILES['video']['name']后缀) - 保存路径选 Web 根目录外,比如
/var/www/app/storage/videos/;若必须放 Web 下,至少加.htaccess(Apache)或location ~ \.mp4$ { deny all; }(Nginx)禁止直接执行 - 调用
move_uploaded_file()前,务必检查$_FILES['video']['error'] === UPLOAD_ERR_OK,否则可能是临时文件丢失或超限
PHP读取视频时长、分辨率等元信息该用什么函数
PHP 自带函数搞不定,getimagesize() 只支持图片,exif_read_data() 对大多数视频无效。得靠外部工具,最常用的是 ffprobe(FFmpeg 套件里的命令行工具):
- 先确认系统已安装 FFmpeg:
ffprobe -version能返回版本号才可用 - 用
shell_exec("ffprobe -v quiet -show_entries format=duration -of default=nw=1 input.mp4 2>/dev/null")提取时长(单位秒) - 分辨率要查流信息:
ffprobe -v quiet -show_entries stream=width,height -of csv=p=0 input.mp4,输出类似"1920,1080" - 注意:Web 用户(如 www-data)可能无权执行
ffprobe,需在 shell 中测试权限,必要时用sudo setfacl -u:www-data /usr/bin/ffprobe
为什么 video/mp4 文件上传后无法播放,但本地能播
大概率是上传过程破坏了 MP4 的 moov atom(关键元数据块),尤其大文件分片上传或服务器配置不当的时候。
- 检查 Nginx 是否有
client_max_body_size限制(默认 1MB),PHP 侧对应upload_max_filesize和post_max_size,三者必须都调大 - MP4 文件必须包含 moov atom 在开头才能流式播放,用
ffmpeg -i input.mp4 -c copy -movflags +faststart output.mp4修复(上传后异步处理) - 别用
file_get_contents()读整个视频再file_put_contents()写出——内存爆掉且易损坏二进制结构,始终用move_uploaded_file()原样搬运
ffprobe 权限和 moov atom 位置这种细节,不亲眼看到播放失败很难意识到问题在哪。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











