需在yii2中实现头像上传及100×100、50×50、30×30三尺寸缩略图生成,涵盖表单验证(宽高≥200px)、路径生成(id补零三级目录)、目录创建、原图保存与gd裁剪五环节。

在Yii2项目中实现用户头像上传并自动生成100×100、50×50、30×30三种尺寸缩略图,需同时满足表单验证、路径生成、目录创建、原图保存与多尺寸裁剪四个环节,缺一不可。
配置模型字段与验证规则
打开用户模型(如User.php),在rules()方法中添加imageUpload字段的验证规则:
返回数组中加入:[['imageUpload'], 'image', 'extensions' => 'png, jpg, jpeg', 'minWidth' => 200, 'maxWidth' => 1000, 'minHeight' => 200, 'maxHeight' => 1000, 'maxSize' => 1024 * 1024]
这一步确保上传文件是合法图片,且宽高不低于200像素——【低于200像素将被拒绝,无法进入后续裁剪流程】
同时在attributeLabels()中补充'imageUpload' => '头像',让表单提示更友好。
生成头像存储路径
在模型中添加静态方法getAvatarPathById(),用于按ID生成三级子目录结构:
输入$id,先用str_pad($id, 6, '0', STR_PAD_LEFT)补零至6位;再截取前2位作为第一级目录,中间2位为第二级,末2位为第三级;最后拼接'.jpg'后缀。
例如ID=7,补零后是'000007',路径即为'avatar/00/00/07.jpg'。这种结构能有效避免单目录下文件过多导致的性能瓶颈。
控制器中处理上传与裁剪
第一步:获取上传文件实例
$imageUpload = UploadedFile::getInstance($model, 'imageUpload');
第二步:验证模型并检查文件是否存在
if ($imageUpload && $model->validate(['imageUpload'])) {
第三步:生成完整存储路径
$path = $model::getAvatarPathById($model->id);
$avatarImage = Yii::getAlias('@uploadPath/') . $path;
第四步:创建目录并保存原图
FileHelper::createDirectory(dirname($avatarImage));
$imageUpload->saveAs($avatarImage);
第五步:调用GD库生成三张尺寸缩略图
依次执行:imagecopyresampled($thumb100, $src, 0, 0, $x, $y, 100, 100, $dst_w, $dst_h) → imagecopyresampled($thumb50, $src, 0, 0, $x, $y, 50, 50, $dst_w, $dst_h) → imagecopyresampled($thumb30, $src, 0, 0, $x, $y, 30, 30, $dst_w, $dst_h);每张图保存前需用imagejpeg($thumb100, $avatarImage_100)写入对应路径。
前端表单与插件集成
方法一:使用ActiveForm + fileInput小部件
echo $form->field($model, 'imageUpload')->fileInput(['accept' => 'image/*']);
方法二:集成kartik-v/yii2-widget-fileinput实现预览
echo $form->field($model, 'imageUpload')->widget(FileInput::classname(), [
'options' => ['accept' => 'image/*'],
'pluginOptions' => ['previewFileType' => 'image', 'showCaption' => false, 'browseLabel' => '选择头像']
]);
注意:若使用FileInput,必须在ActiveForm::begin()中设置enctype="multipart/form-data",否则文件无法提交。











