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 相关文章推荐
用Flash图形化数据(二)
Oct 09 PHP
PHP 中dirname(_file_)讲解
Mar 18 PHP
PHP程序员编程注意事项
Apr 10 PHP
PHP 文件类型判断代码
Mar 13 PHP
一个PHP验证码类代码分享(已封装成类)
Jul 17 PHP
PHP源码之explode使用说明
Aug 05 PHP
PHP 年龄计算函数(精确到天)
Jun 07 PHP
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
Nov 04 PHP
PHP和Shell实现检查SAMBA与NFS Server是否存在
Jan 07 PHP
在PHP程序中使用Rust扩展的方法
Jul 03 PHP
PHP面向对象程序设计实例分析
Jan 26 PHP
ThinkPHP5和ThinkPHP6的区别
Mar 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安装mysql.so扩展的方法
2016/12/31 PHP
php实现36进制与10进制转换功能示例
2017/01/10 PHP
php str_getcsv把字符串解析为数组的实现方法
2017/04/05 PHP
php调用云片网接口发送短信的实现方法
2017/10/25 PHP
PHP设计模式之观察者模式定义与用法分析
2019/04/04 PHP
Laravel5.1 框架Request请求操作常见用法实例分析
2020/01/04 PHP
Javascript操纵Cookie实现购物车程序
2006/11/23 Javascript
firefo xml 读写实现js代码
2009/06/11 Javascript
JavaScript delete 属性的使用
2009/10/08 Javascript
修复ie8&amp;chrome下window的resize事件多次执行
2011/10/20 Javascript
js工具方法弹出蒙版
2013/05/08 Javascript
jquery实现图片渐变切换兼容ie6/Chrome/Firefox
2013/08/02 Javascript
js 删除数组的几种方法小结
2014/02/21 Javascript
修复bash漏洞的shell脚本分享
2014/12/31 Javascript
Vue.js在使用中的一些注意知识点
2017/04/29 Javascript
Windows下使用Nodejs运行js的方法
2017/09/02 NodeJs
element-ui 限制日期选择的方法(datepicker)
2018/05/16 Javascript
Nodejs模块的调用操作实例分析
2018/12/25 NodeJs
详解vue几种主动刷新的方法总结
2019/02/19 Javascript
vue 手机物理监听键+退出提示代码
2020/09/09 Javascript
python实现在sqlite动态创建表的方法
2015/05/08 Python
Python模块包中__init__.py文件功能分析
2016/06/14 Python
获取Django项目的全部url方法详解
2017/10/26 Python
Python实现冒泡排序的简单应用示例
2017/12/11 Python
Python AES加密实例解析
2018/01/18 Python
Python如何获得百度统计API的数据并发送邮件示例代码
2019/01/27 Python
Python使用POP3和SMTP协议收发邮件的示例代码
2019/04/16 Python
python实现用类读取文件数据并计算矩形面积
2020/01/18 Python
Python 中 sorted 如何自定义比较逻辑
2021/02/02 Python
计算 s=(x*y)1/2,用两个宏定义来实现
2016/08/11 面试题
网上卖盒饭创业计划书
2014/01/26 职场文书
交通安全教育制度
2014/02/02 职场文书
会计岗位职责范本
2014/03/07 职场文书
报表员工作失误检讨书范文
2014/09/19 职场文书
2014年单位工作总结范文
2014/11/27 职场文书
2016年国庆节67周年活动总结
2016/04/01 职场文书