开启Yii2调试模式可显示真实错误:在web/index.php顶部确保YII_DEBUG设为true、YII_ENV设为'dev',否则500或空白页会隐藏上传失败的真实原因。

Yii2上传失败时页面只显示500或空白,根本看不到真实错误——这不是代码写错了,而是错误被静默吞掉了。必须让真实报错浮出来,否则所有排查都是瞎猜。
开启调试模式并强制显示PHP错误
生产环境默认屏蔽所有错误输出,第一步就是让它说话:
- 打开
web/index.php,确认开头两行是:defined('YII_DEBUG') or define('YII_DEBUG', true);和defined('YII_ENV') or define('YII_ENV', 'dev'); - 在
index.php最顶部(<?php后立即)加两行:error_reporting(E_ALL); ini_set('display_errors', '1'); - 如果仍无输出,检查
php.ini中display_errors = On是否生效(可通过phpinfo()验证)
检查 $_FILES 是否为空或含错误码
很多“上传失败”其实压根没发出去。别急着看模型验证,先确认文件数据是否到达PHP层:
- 在控制器 action 开头加:
var_dump($_FILES); die;,刷新页面看输出 - 若输出为
array(0) { }或空,说明表单漏了enctype="multipart/form-data"——ActiveForm 必须显式声明:ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) - 若
$_FILES['myFile']['error'] !== 0,对照 PHP 错误码判断原因:1是upload_max_filesize超限;2是表单中MAX_FILE_SIZE隐藏字段超限;4表示根本没选文件
用 UploadedFile::getInstance 获取实例并查 error 属性
Yii封装的 UploadedFile 对象自带更细粒度的错误信息,比直接读 $_FILES 更可靠:
- 写:
$file = UploadedFile::getInstanceByName('myFile');(把'myFile'换成你 input 的name值) - 立刻检查:
var_dump($file, $file ? $file->error : 'no file'); - 注意:
$file->error是整数,不是字符串;值为0才表示上传成功,其他值需结合 PHP 官方文档解读 - 若
$file为null,说明$_FILES为空或 name 不匹配,优先回溯表单和路由
模型验证失败时让错误真正显示在页面上
即使 UploadedFile 实例存在,模型规则校验失败也不会自动抛出异常——它只是默默记在 $model->errors 里:
- 确保控制器中调用了
$model->validate()(或$model->upload()内部已调用) - 在视图中用
$form->field($model, 'imageFile')->fileInput()渲染字段,ActiveForm会自动显示$model->getErrors('imageFile') - 手动检查错误:在控制器里加
if ($model->hasErrors()) { var_dump($model->getErrors()); die; } - 常见坑:
skipOnEmpty => false必须显式设置,否则空文件不会触发验证;maxSize单位是字节,写成'64M'会被忽略
最常被忽略的是:错误不显示,往往不是 Yii 没报错,而是它根本没机会报——PHP 层就截断了请求,或 web 服务器权限拒绝写入 runtime 目录。先让 $_FILES 和 error_reporting 说话,再谈模型和视图。


















