
iOS Safari 上传 MP4 文件时被误判为“INVALID FILE”,根本原因在于仅依赖文件扩展名判断类型存在严重缺陷——Safari 可能不发送或修改 $_FILES["upload_file"]["name"] 中的扩展名,导致 explode(".", $_FILES["upload_file"]["name"])[1] 提取失败或返回错误值。
ios safari 上传 mp4 文件时被误判为“invalid file”,根本原因在于仅依赖文件扩展名判断类型存在严重缺陷——safari 可能不发送或修改 `$_files["upload_file"]["name"]` 中的扩展名,导致 `explode(".", $_files["upload_file"]["name"])[1]` 提取失败或返回错误值。
在 PHP 视频上传场景中,尤其面向多端兼容(如 Windows 浏览器正常而 iOS Safari 报错),单纯基于文件名后缀(extension)校验类型是不可靠的。iOS Safari 在某些版本或配置下会省略扩展名、使用空格/特殊字符截断文件名,甚至因 Content-Disposition 处理差异导致 $_FILES["upload_file"]["name"] 为空或格式异常(例如 "video " 或 ".mp4")。原代码中:
$data = explode(".", $_FILES["upload_file"]["name"]);
$extension = $data[1]; // ⚠️ 危险:若文件名无点号、以点开头、或为空,$data[1] 未定义!
不仅逻辑脆弱,更会触发 PHP Notice(如 Undefined offset: 1),在严格错误报告下可能导致脚本中断;即使静默执行,$extension 也可能为 null 或乱码,致使 in_array($extension, ["mp4"]) 恒为 false,最终返回 'INVALID FILE'。
✅ 正确做法是结合 MIME 类型 + 文件内容检测(魔数)双重验证,并安全提取扩展名:
// 1. 安全获取扩展名(推荐用 pathinfo 的 PATHINFO_EXTENSION)
$original_name = $_FILES["upload_file"]["name"];
$extension = strtolower(pathinfo($original_name, PATHINFO_EXTENSION));
// 2. 优先验证 MIME 类型(由浏览器提供,但需二次确认)
$mime = $_FILES["upload_file"]["type"] ?? '';
$allowed_mimes = ['video/mp4', 'video/mpeg', 'video/quicktime']; // 根据实际支持补充
// 3. 关键:用 fileinfo 扩展验证真实文件类型(防伪造 MIME)
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$real_mime = finfo_file($finfo, $_FILES["upload_file"]["tmp_name"]);
finfo_close($finfo);
// 4. 综合判断(满足任一可信条件即可,建议 AND 逻辑增强安全性)
if (
in_array($real_mime, ['video/mp4', 'video/quicktime']) && // 真实类型可信
in_array($mime, $allowed_mimes) && // 浏览器声明合理
!empty($extension) && $extension === 'mp4' // 扩展名非空且匹配
) {
// ✅ 安全通过,继续处理
} else {
echo 'INVALID FILE';
exit;
}
⚠️ 注意事项:
- 确保服务器已启用 fileinfo 扩展(PHP 默认开启,可通过 php -m | grep fileinfo 验证);
- 不要移除全部校验逻辑(如答案中“删除 else”只是掩盖问题),而应升级为健壮校验;
- iOS Safari 对大文件上传有额外限制(如默认超时短、禁止后台上传),建议检查 upload_max_filesize、post_max_size 和 Nginx/Apache 超时配置;
- 生成缩略图前,务必确认 $path 文件真实存在且可读:if (!is_readable($path)) { die('Video file unreadable'); }。
总结:跨平台文件上传的可靠性不取决于“它叫什么”,而在于“它是什么”。抛弃对客户端文件名的信任,转向服务端内容识别(fileinfo + MIME + 扩展名协同校验),是解决 iOS Safari 兼容性问题的根本路径。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











