YII2.0的文件上传, 并把文件名称重新编译

/**
*@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() ?>



posted @ 2016-03-30 22:50  汀风说后端  阅读(51)  评论(0编辑  收藏  举报