Yii2使用表单上传文件的实例代码


Posted in PHP onAugust 03, 2017

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]);
  }
}

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

参考https://github.com/yiisoft/yii2/blob/master/docs/guide/input-file-upload.md

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
Jul 12 PHP
基于curl数据采集之正则处理函数get_matches的使用
Apr 28 PHP
IIS+fastcgi下PHP运行超时问题的解决办法详解
Jun 20 PHP
php递归使用示例(php递归函数)
Feb 14 PHP
php实现多维数组中每个单元值(数字)翻倍的方法
Feb 16 PHP
PHP数据库操作Helper类完整实例
May 11 PHP
thinkPHP5.0框架应用请求生命周期分析
Mar 25 PHP
解决出现SoapFault (looks like we got no XML document)的问题
Jun 24 PHP
PHP二维关联数组的遍历方式(实例讲解)
Oct 18 PHP
PHP实现模拟http请求的方法分析
Dec 20 PHP
Yii框架的路由配置方法分析
Sep 09 PHP
PHP date_default_timezone_set()设置时区操作实例分析
May 16 PHP
yii2学习教程之5种内置行为类详解
Aug 03 #PHP
PHP实现的简单在线计算器功能示例
Aug 02 #PHP
利用php操作memcache缓存的基础方法示例
Aug 02 #PHP
Yii 2.0实现联表查询加搜索分页的方法示例
Aug 02 #PHP
YII框架中使用memcache的方法详解
Aug 02 #PHP
PHP编程获取图片的主色调的方法【基于Imagick扩展】
Aug 02 #PHP
php7安装mongoDB扩展的方法分析
Aug 02 #PHP
You might like
PHP设计模式 注册表模式
2012/02/05 PHP
麦鸡的TAB切换功能结合了javascript和css
2007/12/17 Javascript
情人节专属 纯js脚本1k大小的3D玫瑰效果
2012/02/11 Javascript
JavaScript中的变量声明早于赋值分析
2012/03/01 Javascript
关于jQuery参考实例 1.0 jQuery的哲学
2013/04/07 Javascript
javascript实现促销倒计时+fixed固定在底部
2013/09/18 Javascript
采用call方式实现js继承
2014/05/20 Javascript
jquery控制背景音乐开关与自动播放提示音的方法
2015/02/06 Javascript
jQuery实现图片渐入渐出切换展示效果
2015/08/15 Javascript
基于JavaScript实现类似于百度学术高级检索功能
2016/03/02 Javascript
动态生成的DOM不会触发onclick事件的原因及解决方法
2016/08/06 Javascript
Canvas实现放射线动画效果
2017/02/15 Javascript
给Easyui-Datebox设置隐藏或者不可用的解决方法
2017/05/26 Javascript
浅析Javascript中双等号(==)隐性转换机制
2017/10/27 Javascript
vue给组件传递不同的值方法
2018/09/29 Javascript
在小程序中推送模板消息的实现方法
2019/07/22 Javascript
webpack HappyPack实战详解
2019/10/08 Javascript
jquery实现点击弹出对话框
2020/02/08 jQuery
解决Vue + Echarts 使用markLine标线(precision精度问题)
2020/07/20 Javascript
如何在Vue项目中添加接口监听遮罩
2021/01/25 Vue.js
[01:03]DOTA2新的征程 你的脚印值得踏上
2014/08/13 DOTA
python实现字符串连接的三种方法及其效率、适用场景详解
2017/01/13 Python
Python 查看文件的读写权限方法
2018/01/23 Python
python多环境切换及pyenv使用过程详解
2019/09/27 Python
Python调用Windows API函数编写录音机和音乐播放器功能
2020/01/05 Python
python属于解释型语言么
2020/06/15 Python
英国高级健康和美容产品零售商:Life and Looks
2019/08/01 全球购物
Kusmi茶美国官网:优质散叶茶和茶包
2019/10/13 全球购物
国际金融专业大学生职业生涯规划书
2013/12/28 职场文书
同学会邀请书大全
2014/01/12 职场文书
2014大学辅导员工作总结
2014/12/02 职场文书
财务人员岗位职责
2015/02/03 职场文书
高中团支书竞选稿
2015/11/21 职场文书
python爬取企查查企业信息之selenium自动模拟登录企查查
2021/04/08 Python
Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶
2021/10/16 Python
Golang map映射的用法
2022/04/22 Golang