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实现链结人气统计
Oct 09 PHP
基于mysql的bbs设计(四)
Oct 09 PHP
PHP下几种删除目录的方法总结
Aug 19 PHP
PHP输出当前进程所有变量/常量/模块/函数/类的示例
Nov 07 PHP
ThinkPHP使用心得分享-分页类Page的用法
May 15 PHP
PHP中new static() 和 new self() 的区别介绍
Jan 09 PHP
PHP中捕获超时事件的方法实例
Feb 12 PHP
php编程每天必学之验证码
Mar 03 PHP
php实现数组纵向转横向并过滤重复值的方法分析
May 29 PHP
yii2的restful api路由实例详解
May 14 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
Mar 26 PHP
如何解决php-fpm启动不了问题
Nov 17 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的开合式多级菜单程序
2006/10/09 PHP
php下将多个数组合并成一个数组的方法与实例代码
2011/02/03 PHP
php学习之 数组声明
2011/06/09 PHP
Nginx服务器上安装并配置PHPMyAdmin的教程
2015/08/18 PHP
php变量与JS变量实现不通过跳转直接交互的方法
2017/08/25 PHP
php生成二维码不保存服务器还有下载功能的实现代码
2018/08/09 PHP
用window.location.href实现刷新另个框架页面
2007/03/07 Javascript
js onkeypress与onkeydown 事件区别详细说明
2012/12/13 Javascript
js设置cookie过期及清除浏览器对应名称的cookie
2013/10/24 Javascript
原生js实现tab选项卡切换
2020/03/23 Javascript
js点击任意区域弹出层消失实现代码
2016/12/27 Javascript
js实现移动端微信页面禁止字体放大
2017/02/16 Javascript
Vue.js实战之通过监听滚动事件实现动态锚点
2017/04/04 Javascript
详解Vue前端对axios的封装和使用
2019/04/01 Javascript
使用 Jest 和 Supertest 进行接口端点测试实例详解
2020/04/25 Javascript
vue使用自定义事件的表单输入组件用法详解【日期组件与货币组件】
2020/06/01 Javascript
Vue 根据条件判断van-tab的显示方式
2020/08/03 Javascript
vue 插槽简介及使用示例
2020/11/19 Vue.js
Python开发如何在ubuntu 15.10 上配置vim
2016/01/25 Python
python脚本爬取字体文件的实现方法
2017/04/29 Python
python设定并获取socket超时时间的方法
2019/01/12 Python
python计算阶乘和的方法(1!+2!+3!+...+n!)
2019/02/01 Python
使用python来调用CAN通讯的DLL实现方法
2019/07/03 Python
基于Python实现拆分和合并GIF动态图
2019/10/22 Python
python 有效的括号的实现代码示例
2019/11/11 Python
HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
2014/03/07 HTML / CSS
莫斯科购买书籍网站:Book24
2020/01/12 全球购物
餐饮主管岗位职责
2013/12/10 职场文书
央视元宵晚会主持串词
2014/03/25 职场文书
英文请假条
2014/04/11 职场文书
2014年教师节讲话稿5篇
2014/09/10 职场文书
党员干部对十八届四中全会的期盼
2014/10/17 职场文书
索赔员岗位职责
2015/02/15 职场文书
爱心捐赠活动简讯
2015/07/20 职场文书
同学会感言
2015/07/30 职场文书
MySQL表的增删改查(基础)
2021/04/05 MySQL