• 技术文章 >后端开发 >php教程

    Yii2实现表单上传文件功能

    小云云小云云2018-01-30 14:01:54原创968
    本文主要介绍Yii2使用表单上传文件的实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。

    1、单个文件上传

    首先建立一个模型models/UploadForm.php,内容如下

    namespace app\models;
    
    use yii\base\Model;
    use yii\web\UploadedFile;
    
    /**
     * UploadForm is the model behind the upload form.
     */
    class UploadForm extends Model
    {
      /**
       * @var UploadedFile file attribute
       */
      public $file;
    
      /**
       * @return array the validation rules.
       */
      public function rules()
      {
        return [
          [['file'], 'file'],
        ];
      }
    }

    再建立一个视图文件,内容如下

    <?php
    use yii\widgets\ActiveForm;
    ?>
    
    <?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?>
    
    <?= $form->field($model, 'file')->fileInput() ?>
    
    <button>Submit</button>
    
    <?php ActiveForm::end() ?>

    最后建立控制器文件,内容如下

    namespace app\controllers;
    
    use Yii;
    use yii\web\Controller;
    use app\models\UploadForm;
    use yii\web\UploadedFile;
    
    class SiteController extends Controller
    {
      public function actionUpload()
      {
        $model = new UploadForm();
    
        if (Yii::$app->request->isPost) {
          $model->file = UploadedFile::getInstance($model, 'file');
    
          if ($model->file && $model->validate()) {        
            $model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension);
          }
        }
    
        return $this->render('upload', ['model' => $model]);
      }
    }

    注意这里我们没有用model->load(...),而是用了UploadedFile::getInstance(...)。区别是后者不会执行$model->validate(),所以需要手动的去执行$model->validate()来检验数据的合法性。如果检验通过了,上传的文件保存在uploads文件夹下,即web目录下的uploads里。

    一些可选的配置选项

    上传文件不能为空

    public function rules()
    {
      return [
        [['file'], 'file', 'skipOnEmpty' => false],
      ];
    }

    上传类型,不仅可以根据扩展名检验,还可以根据文件的内容进行检验

    public function rules()
    {
      return [
        [['file'], 'file', 'extensions' => 'jpg, png', 'mimeTypes' => 'image/jpeg, image/png',],
      ];
    }

    2、多文件上传

    如果你想一次上传多个文件,只需调节几个参数就可以达到目的

    Model:

    class UploadForm extends Model
    {
      /**
       * @var UploadedFile|Null file attribute
       */
      public $file;
    
      /**
       * @return array the validation rules.
       */
      public function rules()
      {
        return [
          [['file'], 'file', 'maxFiles' => 10], // <--- here!
        ];
      }
    }

    View:

    <?php
    use yii\widgets\ActiveForm;
    
    $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]);
    ?>
    
    <?= $form->field($model, 'file[]')->fileInput(['multiple' => true]) ?>
    
      <button>Submit</button>
    
    <?php ActiveForm::end(); ?>

    与单文件上传不同的是下面这句

    $form->field($model, 'file[]')->fileInput(['multiple' => true])

    Controller:

    namespace app\controllers;
    
    use Yii;
    use yii\web\Controller;
    use app\models\UploadForm;
    use yii\web\UploadedFile;
    
    class SiteController extends Controller
    {
      public function actionUpload()
      {
        $model = new UploadForm();
    
        if (Yii::$app->request->isPost) {
          $model->file = UploadedFile::getInstances($model, 'file');
    
          if ($model->file && $model->validate()) {
            foreach ($model->file as $file) {
              $file->saveAs('uploads/' . $file->baseName . '.' . $file->extension);
            }
          }
        }
    
        return $this->render('upload', ['model' => $model]);
      }
    }

    这样就可以实现多文件上传了。

    相关推荐:

    PHP和AjaxForm实现异步带进度条上传文件

    jQuery ajaxupload插件实现无刷新上传文件详解

    Ajax表单异步上传文件实例代码详解

    以上就是Yii2实现表单上传文件功能的详细内容,更多请关注php中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:Yii2 文件 上传
    上一篇:Yii2中的load()和save()详解 下一篇:Kindeditor编辑器添加图片上传水印实现方法
    大前端线上培训班

    相关文章推荐

    • 你必须了解PHP中什么是抽象类和抽象方法• 怎样使用PHP中的spl_autoload_register() 和 __autoload() 函数?• PHP中怎样去判断对象是否属于一个类?• 五分钟带你看PHP中的接口interface声明与应用(实例详解)• PHP中怎样完成Cookie的创建、读取和删除?

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网