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 相关文章推荐
Apache2 httpd.conf 中文版
Dec 06 PHP
PHP 金额数字转换成英文
May 06 PHP
php递归实现无限分类生成下拉列表的函数
Aug 08 PHP
新浪微博API开发简介之用户授权(PHP基础篇)
Sep 25 PHP
php中http_build_query 的一个问题
Mar 25 PHP
WampServer搭建php环境时遇到的问题汇总
Jul 23 PHP
WordPress中创建用户角色的相关PHP函数使用详解
Dec 25 PHP
解析WordPress中的post_class与get_post_class函数
Jan 04 PHP
php封装json通信接口详解及实例
Mar 07 PHP
Laravel框架文件上传功能实现方法示例
Apr 16 PHP
php生成微信红包数组的方法
Sep 05 PHP
laravel 使用auth编写登录的方法
Sep 30 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 源代码压缩小工具
2009/12/22 PHP
PHP实现可自定义样式的分页类
2016/03/29 PHP
laravel框架使用阿里云短信发送消息操作示例
2020/02/15 PHP
javascript globalStorage类代码
2009/06/04 Javascript
jQuery 获取URL参数的插件
2010/03/04 Javascript
jquery上传插件fineuploader上传文件使用方法(jquery图片上传插件)
2013/12/05 Javascript
手机端网页点击链接触发自动拨打或保存电话的示例代码
2014/08/15 Javascript
浅析node连接数据库(express+mysql)
2015/11/30 Javascript
jQuery easyui的validatebox校验规则扩展及easyui校验框validatebox用法
2016/01/18 Javascript
使用javascript插入样式
2016/03/14 Javascript
JavaScript里 ==与===区别详解
2016/08/16 Javascript
JavaScript 闭包机制详解及实例代码
2016/10/10 Javascript
JQuery 获取多个select标签option的text内容(实例)
2017/09/07 jQuery
vue项目中公用footer组件底部位置的适配问题
2018/05/10 Javascript
Vue面试题及Vue知识点整理
2018/10/07 Javascript
JS使用Prim算法和Kruskal算法实现最小生成树
2019/01/17 Javascript
微信公众平台 客服接口发消息的实现代码(Java接口开发)
2019/04/17 Javascript
微信小程序页面间传值与页面取值操作实例分析
2019/04/30 Javascript
js实现随机div颜色位置 类似满天星效果
2019/10/24 Javascript
JS如何实现动态添加的元素绑定事件
2019/11/12 Javascript
解决微信小程序scroll-view组件无横向滚动的问题
2020/02/04 Javascript
jQuery实现可以扩展的日历
2020/12/01 jQuery
使用Python导出Excel图表以及导出为图片的方法
2015/11/07 Python
python中几种自动微分库解析
2019/08/29 Python
python os.path.isfile()因参数问题判断错误的解决
2019/11/29 Python
python应用Axes3D绘图(批量梯度下降算法)
2020/03/25 Python
Python利用imshow制作自定义渐变填充柱状图(colorbar)
2020/12/10 Python
Stefania Mode英国:奢华设计师和时尚服装
2017/10/23 全球购物
Bugatchi官方网站:男士服装在线
2019/04/10 全球购物
七年级政治教学反思
2014/02/03 职场文书
企业诚信承诺书
2014/05/23 职场文书
学校欢迎标语
2014/06/18 职场文书
校车安全管理责任书
2015/05/11 职场文书
个人求职意向书
2015/05/11 职场文书
nginx location中多个if里面proxy_pass的方法
2021/03/31 Servers
spring cloud 配置中心客户端启动遇到的问题
2021/09/25 Java/Android