YII2.0的文件上传, 并把文件名称重新编译
/**
*@Action 文件上传示例
*@这里我们演示的是一个YII2.0的文件上传, 并把文件名称重新编译
*@我们上传的是一个叫 photo 的jpg和png格式的文件
Models模型层
VIEWS视图层
*@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() ?>