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生成缩略图的代码
Jan 12 PHP
浅析Yii中使用RBAC的完全指南(用户角色权限控制)
Jun 20 PHP
学习php过程中的一些注意点的总结
Oct 25 PHP
ThinkPHP3.1新特性之Action参数绑定
Jun 19 PHP
php数组中删除元素之重新索引的方法
Sep 16 PHP
php将access数据库转换到mysql数据库的方法
Dec 24 PHP
js代码实现微博导航栏
Jul 30 PHP
PHP实现操作redis的封装类完整实例
Nov 14 PHP
学习php设计模式 php实现策略模式(strategy)
Dec 07 PHP
Zend Framework框架之Zend_Mail实现发送Email邮件验证功能及解决标题乱码的方法
Mar 21 PHP
php获取一定范围内取N个不重复的随机数
May 28 PHP
Yii的Srbac插件用法详解
Jul 14 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循环遍历数组的3种方法list()、each()和while总结
2014/11/19 PHP
CI框架入门之MVC简单示例
2016/11/21 PHP
PHP数组去重的更快实现方式分析
2018/05/09 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
php字符串函数 str类常见用法示例
2020/05/15 PHP
jquery 中多条件选择器,相对选择器,层次选择器的区别
2012/07/03 Javascript
innerText和textContent对比及使用介绍
2013/02/27 Javascript
node.js中的buffer.write方法使用说明
2014/12/10 Javascript
NodeJS学习笔记之Http模块
2015/01/13 NodeJs
使用jquery+CSS3实现仿windows10开始菜单的下拉导航菜单特效
2015/09/24 Javascript
Jquery跨浏览器文本复制插件Zero Clipboard的使用方法
2016/02/28 Javascript
轻松掌握JavaScript中介者模式
2016/08/26 Javascript
jquery日历插件e-calendar升级版
2016/11/10 Javascript
javascript监听页面刷新和页面关闭事件方法详解
2017/01/09 Javascript
浅谈ajax在jquery中的请求和servlet中的响应
2018/01/22 jQuery
Vue 应用中结合vux使用微信 jssdk的方法
2018/08/28 Javascript
Node.js中的不安全跳转如何防御详解
2018/10/21 Javascript
vue 子组件watch监听不到prop的解决
2020/08/09 Javascript
[46:25]DOTA2上海特级锦标赛主赛事日 - 4 败者组第五轮 MVP.Phx VS EG第二局
2016/03/05 DOTA
python求最大值最小值方法总结
2019/06/25 Python
让IE支持HTML5的方法
2012/12/11 HTML / CSS
英国剑桥包官网:The Cambridge Satchel Company
2016/08/01 全球购物
香港个人化生活购物网站:Ballyhoo Limited
2016/09/10 全球购物
Ibood荷兰:互联网每日最佳在线优惠
2019/02/28 全球购物
阿联酋手表和配饰购物网站:Rivolishop
2019/11/25 全球购物
办公室前台的岗位职责
2013/12/20 职场文书
师德学习感言
2014/01/31 职场文书
政法学院毕业生求职信
2014/02/28 职场文书
投资建议书模板
2014/05/12 职场文书
2014医学院领导班子对照检查材料思想汇报
2014/09/19 职场文书
创先争优个人总结
2015/03/04 职场文书
2015年收银员个人工作总结
2015/04/01 职场文书
2016学习雷锋精神活动倡议书
2015/04/27 职场文书
同事去世追悼词
2015/06/23 职场文书
python 统计代码耗时的几种方法分享
2021/04/02 Python
Python数据可视化之用Matplotlib绘制常用图形
2021/06/03 Python