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 相关文章推荐
apache rewrite_module模块使用教程
Jan 10 PHP
PHP 在5.1.* 和5.2.*之间 PDO数据库操作中的不同之处小结
Mar 07 PHP
实测在class的function中include的文件中非php的global全局环境
Jul 15 PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
Jun 12 PHP
php实现简单文件下载的方法
Jan 30 PHP
PHP模板引擎smarty详细介绍
May 26 PHP
Yii中CGridView实现批量删除的方法
Dec 28 PHP
Laravel中注册Facades的步骤详解
Mar 16 PHP
PHP 以POST方式提交XML、获取XML,解析XML详解及实例
Oct 26 PHP
详解EventDispatcher事件分发组件
Dec 25 PHP
PHP基于ORM方式操作MySQL数据库实例
Jun 21 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
Apr 05 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中PDO基础教程 入门级
2011/09/04 PHP
laravel安装和配置教程
2014/10/29 PHP
php数值计算num类简单操作示例
2020/05/15 PHP
jquery.ajax的url中传递中文乱码问题的解决方法
2014/02/07 Javascript
javascript实现锁定网页、密码解锁效果(类似系统屏幕保护效果)
2014/08/15 Javascript
JavaScript实现网页加载进度条代码超简单
2015/09/21 Javascript
jQuery基于toggle实现click触发DIV的显示与隐藏问题分析
2016/06/12 Javascript
Javascript发送AJAX请求实例代码
2016/08/21 Javascript
详解js的事件代理(委托)
2016/12/22 Javascript
NodeJS配置HTTPS服务实例分享
2017/02/19 NodeJs
微信小程序实现瀑布流布局与无限加载的方法详解
2017/05/12 Javascript
ComboBox(下拉列表框)通过url加载调用远程数据的方法
2017/08/06 Javascript
JavaScript判断输入是否为数字类型的方法总结
2017/09/28 Javascript
Node.js静态服务器的实现方法
2018/02/28 Javascript
Angular使用ControlValueAccessor创建自定义表单控件
2019/03/08 Javascript
Koa 中的错误处理解析
2019/04/09 Javascript
原生javascript运动函数的封装示例【匀速、抛物线、多属性的运动等】
2020/02/23 Javascript
python中字符串变二维数组的实例讲解
2018/04/03 Python
儿童编程python入门
2018/05/08 Python
Python考拉兹猜想输出序列代码实践
2019/07/05 Python
基于python实现蓝牙通信代码实例
2019/11/19 Python
NumPy排序的实现
2020/01/21 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
2020/07/02 Python
详解在Python中使用Torchmoji将文本转换为表情符号
2020/07/27 Python
浅析HTML5页面元素及属性
2021/01/20 HTML / CSS
党员思想汇报范文
2013/12/30 职场文书
食品安全宣传标语
2014/06/07 职场文书
员工工作及收入证明
2014/10/28 职场文书
导游欢送词
2015/01/31 职场文书
《7的乘法口诀》教学反思
2016/02/18 职场文书
ES6 解构赋值的原理及运用
2021/05/25 Javascript
Python爬虫基础初探selenium
2021/05/31 Python
Python办公自动化之教你如何用Python将任意文件转为PDF格式
2021/06/28 Python
利用Python将list列表写入文件并读取的方法汇总
2022/03/25 Python
Python如何使用循环结构和分支结构
2022/04/13 Python
浅谈音视频 pts dts基本概念及理解
2022/08/05 数码科技