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中通过ADODB库实现调用Access数据库之修正版本
Dec 31 PHP
php中对xml读取的相关函数的介绍一
Jun 05 PHP
删除html标签得到纯文本可处理嵌套的标签
Apr 28 PHP
ThinkPHP打开验证码页面显示乱码的解决方法
Dec 18 PHP
PHP中浮点数计算比较及取整不准确的解决方法
Jan 09 PHP
PHP GD库相关图像生成和处理函数小结
Sep 30 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
Nov 17 PHP
php实现支付宝当面付(扫码支付)功能
May 30 PHP
实例分析10个PHP常见安全问题
Jul 09 PHP
php使用curl模拟多线程实现批处理功能示例
Jul 25 PHP
PHP单文件上传原理及上传函数的封装操作示例
Sep 02 PHP
Cookie跨域问题解决方案代码示例
Nov 24 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中强制下载文件的代码(解决了IE下中文文件名乱码问题)
2011/05/09 PHP
php最简单的删除目录与文件实现方法
2014/11/28 PHP
JavaScript 事件对象的实现
2009/07/13 Javascript
Ext.MessageBox工具类简介
2009/12/10 Javascript
情人节之礼 js项链效果
2012/02/13 Javascript
jquery 跳到顶部和底部动画2句代码简单实现
2013/07/18 Javascript
可自己添加html的伪弹出框实现代码
2013/09/08 Javascript
jQuery中prependTo()方法用法实例
2015/01/08 Javascript
JS往数组中添加项性能分析
2015/02/25 Javascript
js电话号码验证方法
2015/09/28 Javascript
jQuery的图片轮播插件PgwSlideshow使用详解
2016/08/11 Javascript
详解VUE 定义全局变量的几种实现方式
2017/06/01 Javascript
AngularJS  ng-repeat遍历输出的用法
2017/06/19 Javascript
JavaScript内置对象math,global功能与用法实例分析
2019/06/10 Javascript
JS实现横向轮播图(中级版)
2020/01/18 Javascript
vue中keep-alive、activated的探讨和使用详解
2020/07/26 Javascript
给Python初学者的一些编程技巧
2015/04/03 Python
Windows下Python2与Python3两个版本共存的方法详解
2017/02/12 Python
Django异步任务之Celery的基本使用
2019/03/23 Python
Python3标准库之threading进程中管理并发操作方法
2020/03/30 Python
python 已知三条边求三角形的角度案例
2020/04/12 Python
使用python对excel表格处理的一些小功能
2021/01/25 Python
css3的transform造成z-index无效解决方案
2014/12/04 HTML / CSS
严选全球尖货,立足香港:Bonpont宝盆
2018/07/24 全球购物
幼教个人求职信范文
2013/12/02 职场文书
大学生村官工作感言
2014/01/10 职场文书
审计主管岗位职责
2014/01/31 职场文书
说明书格式及范文
2014/05/07 职场文书
教师考核材料
2014/05/21 职场文书
奥林匹克运动会口号
2014/06/19 职场文书
学生检讨书怎么写
2014/10/09 职场文书
2014年团支部工作总结
2014/11/17 职场文书
2016三八妇女节慰问信
2015/11/30 职场文书
Python利器openpyxl之操作excel表格
2021/04/17 Python
python中subplot大小的设置步骤
2021/06/28 Python
Python OpenCV形态学运算示例详解
2022/04/07 Python