/**
*@Action 文件上传示例
*@这里我们演示的是一个YII2.0的文件上传, 并把文件名称重新编译
*@我们上传的是一个叫 photo 的jpg和png格式的文件
*/
Controller 控制器
<?php namespace frontend\controllers; use yii\web\UploadedFile; #载入文件上传类 use frontend\models\UploadFile; #引入我们自己的文件上传处理用的model class ThumbController extends \yii\web\Controller { /** *@Action 文件上传示例 *@这里我们演示的是一个YII2.0的文件上传, 并把文件名称重新编译 *@我们上传的是一个叫 photo 的jpg和png格式的文件 */ public function actionIndex() { /** *@注意: * 1. 如果控制器做了 validate 的验证那么 model 的上传方法就不要再做 validate 的验证了 * 2. 注意上传的文件的name的命名(我在这里上传的是一个叫photo的文件) * 3. 如果要在控制器做 validate 的验证则要注意 : *-------------①.validate的验证必须放在调用model的上传方法之前 *-------------②.我在这里给出一个示例 *--------------------------------------------------------------- *# $model = new UploadForm(); *# if (\Yii::$app->request->isPost) *# { *# $model->photo = UploadedFile::getInstance($model, 'photo'); *# if($model->validate() && $path=$model->upload()) *# { *# echo $path;die; //输出文件路径 *# } *# else *# { *# var_dump($model->getErrors());die; *# } *# } * */ /** *@我在这里推荐一个简易的做法 ↓ */ $model = new UploadFile(); if (\Yii::$app->request->isPost) { $image = $model->photo = UploadedFile::getInstance($model, 'photo'); if ($file_path = $model->upload($image)) { echo $file_path;die; return; } } return $this->render('index',[ 'model' => $model ]); }
Models模型层
<?php namespace frontend\models; use yii\base\Model; use yii\web\UploadedFile; #载入文件上传类 class UploadFile extends Model{ public $photo; public function rules() { return [ [['photo'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg','wrongExtension'=>'只能上传{extensions}类型文件!'], ]; } /** *@Action 文件上传 */ public function upload() { if ($this->validate()) { $rootPath = "uploads/"; //定义上传的根目录 $ext = $this->photo->extension; //获取文件的后缀(*格式*) $randName = time() . rand(1000, 9999) . "." . $ext; //重新编译文件名称 $path = abs(crc32($randName) % 500); //编译第二层文件夹名称 $rootPath = $rootPath . $path . "/"; //拼接 if (!file_exists($path)){ //判断该目录是否存在 mkdir($rootPath,true); } $re = $this->photo->saveAs($rootPath . $randName); //调用内置封装类**执行上传 if($re){ return $rootPath . $randName; //上传成功**返回文件的路径名称 }else{ return false; } } else { return false; } } }
VIEWS视图层
<?php use yii\widgets\ActiveForm; ?> <?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?> <?= $form->field($model, 'photo')->fileInput() ?> <button>Submit</button> <?php ActiveForm::end() ?>
时间: 2024-12-03 16:09:05