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调用三种数据库的方法(2)
Oct 09 PHP
php session 检测和注销
Mar 16 PHP
PHP里的中文变量说明
Jul 23 PHP
PHP测试程序运行时间的类
Feb 05 PHP
PHP无法访问远程mysql的问题分析及解决
May 16 PHP
解析csv数据导入mysql的方法
Jul 01 PHP
nginx+thinkphp下解决不支持pathinfo模式
Jul 01 PHP
yii使用bootstrap分页样式的实例
Jan 17 PHP
详谈php中 strtr 和 str_replace 的效率问题
May 14 PHP
PHP设计模式之装饰器模式实例详解
Feb 07 PHP
laravel 修改.htaccess文件 重定向public的解决方法
Oct 12 PHP
PHP 裁剪图片
Mar 09 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处理文件的小例子(解压缩,删除目录)
2013/02/03 PHP
php示例详解Constructor Prototype Pattern 原型模式
2015/10/15 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
2016/03/21 PHP
PHP封装的非对称加密RSA算法示例
2018/05/28 PHP
任意位置显示html菜单
2007/02/01 Javascript
javascritp实现input输入框相关限制用法
2007/06/29 Javascript
jquery select选中的一个小问题
2009/10/11 Javascript
cnblogs csdn 代码运行框实现代码
2009/11/02 Javascript
jQuery实现的立体文字渐变效果
2010/05/17 Javascript
js读取本地excel文档数据的代码
2010/11/11 Javascript
onclick与listeners的执行先后问题详细解剖
2013/01/07 Javascript
使用javascipt---实现二分查找法
2013/04/10 Javascript
javascript中不等于的代码是什么怎么写
2013/12/29 Javascript
javascript生成随机大小写字母的方法
2014/02/20 Javascript
Bootstrap每天必学之导航条(二)
2016/03/01 Javascript
javascript和jquery实现用户登录验证
2016/05/04 Javascript
使用 bootstrap modal遇到的问题小结
2016/11/09 Javascript
JS如何实现在页面上快速定位(锚点跳转问题)
2017/08/14 Javascript
vue2.0 自定义 饼状图 (Echarts)组件的方法
2018/03/02 Javascript
详解Vue CLI3 多页应用实践和源码设计
2018/08/30 Javascript
vue中的watch监听数据变化及watch中各属性的详解
2018/09/11 Javascript
element日历calendar组件上月、今天、下月、日历块点击事件及模板源码
2020/07/27 Javascript
原生JavaScript实现留言板
2021/01/10 Javascript
linux系统使用python获取cpu信息脚本分享
2014/01/15 Python
Python的Django框架中消息通知的计数器实现教程
2016/06/13 Python
python操作文件的参数整理
2019/06/11 Python
Python实现微信小程序支付功能
2019/07/25 Python
Python进阶之使用selenium爬取淘宝商品信息功能示例
2019/09/16 Python
给keras层命名,并提取中间层输出值,保存到文档的实例
2020/05/23 Python
NICKIS.com荷兰:设计师儿童时装
2020/01/08 全球购物
程序集与命名空间有什么不同
2014/07/25 面试题
Java语言程序设计测试题选择题部分
2014/04/03 面试题
销售活动策划方案
2014/08/26 职场文书
交通事故死亡赔偿协议书
2014/12/03 职场文书
go语言中切片与内存复制 memcpy 的实现操作
2021/04/27 Golang
漫改真人电影「萌系男友是燃燃的橘色」公开先导视觉图
2022/03/21 日漫