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执行zip与rar解压缩方法实现代码
Dec 05 PHP
PHP动态分页函数,PHP开发分页必备啦
Nov 07 PHP
PHP防CC攻击实现代码
Dec 29 PHP
关于zend studio 出现乱码问题的总结
Jun 23 PHP
PHP中array_map与array_column之间的关系分析
Aug 19 PHP
PHP中exec函数和shell_exec函数的区别
Aug 20 PHP
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
Jun 17 PHP
CentOS下PHP7的编译安装及MySQL的支持和一些常见问题的解决办法
Dec 17 PHP
Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法
May 31 PHP
PHP获取路径和目录的方法总结【必看篇】
Mar 04 PHP
php获取excel文件数据
Apr 21 PHP
PHP底层运行机制与工作原理详解
Jul 31 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 小乘法表实现代码
2009/07/16 PHP
JS异常处理try..catch语句的作用和实例
2014/05/05 PHP
smarty模板引擎中内建函数if、elseif和else的使用方法
2015/01/22 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
2017/09/16 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
2021/03/09 PHP
jQuery遍历Form示例代码
2013/09/03 Javascript
jquery实现页面虚拟键盘特效
2015/08/08 Javascript
jquery实现可横向和竖向展开的动态下滑菜单效果
2015/08/24 Javascript
jQuery如何封装输入框插件
2016/08/19 Javascript
jQuery实现圣诞节礼物传送(花式轮播)
2016/12/25 Javascript
Vuex中mutations与actions的区别详解
2018/03/01 Javascript
vue判断input输入内容全是空格的方法
2018/03/02 Javascript
JavaScript实现计算圆周率到小数点后100位的方法示例
2018/05/08 Javascript
javascript简单实现深浅拷贝过程详解
2019/10/08 Javascript
swiper实现异形轮播效果
2019/11/28 Javascript
详解微信小程序之提高应用速度小技巧
2020/01/07 Javascript
Vue实现boradcast和dispatch的示例
2020/11/13 Javascript
Python strip lstrip rstrip使用方法
2008/09/06 Python
浅谈python迭代器
2017/11/08 Python
对Python 网络设备巡检脚本的实例讲解
2018/04/22 Python
Python实现中一次读取多个值的方法
2018/04/22 Python
Python get获取页面cookie代码实例
2018/09/12 Python
django 自定义过滤器(filter)处理较为复杂的变量方法
2019/08/12 Python
Python学习笔记之列表和成员运算符及列表相关方法详解
2019/08/22 Python
浅析使用Python搭建http服务器
2019/10/27 Python
Python 中 -m 的典型用法、原理解析与发展演变
2019/11/11 Python
Pandas读取csv时如何设置列名
2020/06/02 Python
请问如下代码执行后a和b的值分别是什么
2016/05/05 面试题
什么是ARP(Address Resolution Protocol)地址解析协议
2013/10/31 面试题
工程师求职简历的自我评价分享
2013/10/10 职场文书
五星级酒店餐饮部总监的标准岗位职责
2014/02/17 职场文书
农业项目建议书
2014/08/25 职场文书
2014年庆祝国庆65周年演讲稿
2014/09/21 职场文书
优秀班组申报材料
2014/12/25 职场文书
少先队入队仪式主持词
2015/07/04 职场文书
Python中seaborn库之countplot的数据可视化使用
2021/06/11 Python