YII2.0的文件上传, 并把文件名称重新编译
阅读原文时间:2023年07月09日阅读:3

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