使用PHP上传MP4视频时部分文件提示未选择文件该如何排查
PHP视频上传部分文件提示"No File Selected"问题排查及解决方案
问题核心原因
你认为该问题与php.ini配置无关属于认知错误:PHP对上传文件的解析处理发生在业务代码执行前,只要文件大小、请求大小超过服务端阈值,PHP内核会直接丢弃上传的文件数据,你在代码中获取到的就是处理后的空$_FILES结果,自然会触发你写的"No File Selected"提示。
常见触发原因如下:
- 服务端PHP配置限制:
php.ini中的upload_max_filesize、post_max_size参数值小于你上传的6MB文件,导致文件被直接丢弃 - Web服务器配置限制:Nginx默认
client_max_body_size为2MB、Apache默认LimitRequestBody也有大小限制,超过阈值后会直接截断POST请求,后端PHP接收不到完整的文件数据 - 文件名编码问题:无法上传的文件名包含中文、特殊符号或空格,部分低版本服务端环境编码不兼容导致文件解析失败
- 上传超时限制:
max_input_time、max_execution_time参数值过小,大文件上传还没完成就被服务端强制终止请求
排查步骤
1. 完善错误判断逻辑,获取具体错误信息
替换你的PHP代码为以下内容,可直接打印出具体的错误原因:
// 开启所有错误提示 error_reporting(E_ALL); ini_set('display_errors', 1); // 打印原始请求数据便于排查 var_dump($_POST); var_dump($_FILES); var_dump(error_get_last()); $uploadErrors = [ UPLOAD_ERR_INI_SIZE => '文件大小超过php.ini配置的upload_max_filesize限制', UPLOAD_ERR_FORM_SIZE => '文件大小超过表单MAX_FILE_SIZE限制', UPLOAD_ERR_PARTIAL => '文件仅部分上传完成', UPLOAD_ERR_NO_FILE => '未检测到上传的文件', UPLOAD_ERR_NO_TMP_DIR => '服务端缺少临时存储目录', UPLOAD_ERR_CANT_WRITE => '磁盘无写入权限', UPLOAD_ERR_EXTENSION => 'PHP扩展拦截了文件上传', ]; if(!isset($_FILES['file'])) { echo "错误:未接收到文件参数,通常是请求总大小超过服务端限制"; } elseif ($_FILES['file']['error'] !== UPLOAD_ERR_OK) { echo "上传失败:" . ($uploadErrors[$_FILES['file']['error']] ?? '未知错误,错误码:' . $_FILES['file']['error']); } else { echo "上传成功,文件信息:"; print_r($_FILES); }
2. 核对PHP核心配置
新建phpinfo文件,访问查看以下参数值是否符合你的上传需求:
upload_max_filesize:单文件最大上传大小,建议设置为要上传的最大视频的1.2倍以上post_max_size:POST请求总大小,必须大于upload_max_filesizemax_input_time:请求接收最大时长,大文件上传建议设置为300秒以上max_execution_time:PHP脚本最大执行时长,建议和max_input_time保持一致memory_limit:脚本内存限制,建议设置为128M以上
3. 核对Web服务器配置
- Nginx环境:在nginx.conf或站点配置文件中添加/修改
client_max_body_size 20M;(根据你的需求调整大小),修改后执行nginx -s reload重载配置 - Apache环境:检查站点配置中的
LimitRequestBody参数,以及.htaccess中的php_value post_max_size、php_value upload_max_filesize配置是否符合要求
4. 特殊字符处理
如果排查后发现是文件名编码问题,建议前端上传前将文件名转成英文字母、数字组合的格式,或统一将服务端字符集设置为UTF-8。
内容的提问来源于stack exchange,提问作者Ryan D
相关产品推荐
相关产品推荐

