Yii2中必须在模型层用file验证器的maxSize参数限制上传文件体积,单位为字节,需配合skipOnEmpty=>false,并可通过场景区分不同大小上限,必要时在upload()中用filesize()二次校验实际大小。

在Yii2中限制用户上传文件的体积,防止过大文件占用服务器资源或拖慢响应速度,必须在模型层通过file验证器的maxSize参数控制,仅靠前端限制完全不可靠。
基础配置:设置单个文件最大允许大小
打开你的上传模型(如UploadForm),在rules()方法中为文件属性添加file验证规则,并明确指定maxSize值:
① 找到imageFile(或其他文件属性名)对应的验证规则项;
② 在该规则数组中加入'maxSize' => 2097152(即2MB);
③ 注意单位是字节,不是KB或MB——写成2048 * 1024或2 * 1024 * 1024更直观,避免手误写错零的个数;
④ 必须同时保留'skipOnEmpty' => false,否则用户不选文件时会跳过验证,导致后续saveAs失败却无提示。
示例代码片段:
return [ [['imageFile'], 'file', 'skipOnEmpty' => false, 'extensions' => 'jpg, png', 'maxSize' => 2097152] ];
进阶控制:区分场景设定不同大小上限
当同一模型用于头像上传(≤500KB)和资料附件上传(≤10MB)时,需用场景(scenario)隔离验证逻辑。
方法一:在rules()中按场景绑定maxSize
在验证规则中添加'on'键,分别指定不同场景下的maxSize值:
[['file'], 'file', 'on' => 'avatar', 'maxSize' => 512000, 'extensions' => 'jpg,png,gif']
[['file'], 'file', 'on' => 'attachment', 'maxSize' => 10485760, 'extensions' => 'pdf,docx,xlsx']
方法二:在scenarios()中预设属性集,再配合rules中的on条件
先定义场景对应字段:public function scenarios() { return ['avatar' => ['file'], 'attachment' => ['file']]; }
然后在rules()里写带on的验证项——这样能确保load()时只接收对应场景的字段,避免附件场景误传头像字段触发校验。
补充校验:服务端二次确认文件真实大小
maxSize只校验$_FILES['xxx']['size'],但攻击者可能伪造该值。若业务对安全性要求极高,需在upload()方法中追加物理读取校验:
调用$this->imageFile->tempName获取临时路径;
用filesize($this->imageFile->tempName)重新获取实际字节数;
手动比对是否超过阈值,超限则$this->addError('imageFile', '文件实际大小超出限制');并返回false;
【注意:此步必须在$this->validate()之后、saveAs()之前执行,否则临时文件已被移动或清除】


















