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 进程锁定问题分析研究
Nov 24 PHP
PHP 面向对象 final类与final方法
May 05 PHP
php利用iframe实现无刷新文件上传功能的代码
Sep 29 PHP
PHP自带函数给数字或字符串自动补齐位数
Jul 29 PHP
Thinkphp多文件上传实现方法
Oct 31 PHP
php使用数组填充下拉列表框的方法
Mar 31 PHP
Yii2.0表关联查询实例分析
Jul 18 PHP
PHP简单日历实现方法
Jul 20 PHP
PHP实现生成带背景的图形验证码功能
Oct 03 PHP
php利用fsockopen GET/POST提交表单及上传文件
May 22 PHP
PHP错误处理函数register_shutdown_function使用示例
Jul 03 PHP
PHP网页安全认证的实例详解
Sep 28 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/05/15 PHP
PHP+ajaxfileupload+jcrop插件完美实现头像上传剪裁
2014/06/09 PHP
ThinkPHP实现将本地文件打包成zip下载
2014/06/26 PHP
关于取不到由location.href提交而来的上级页面地址的解决办法
2009/07/30 Javascript
jQeury淡入淡出需要注意的问题
2010/09/08 Javascript
Javascript 闭包引起的IE内存泄露分析
2012/05/23 Javascript
CascadeView级联组件实现思路详解(分离思想和单链表)
2016/04/12 Javascript
AngularJS的Filter的示例详解
2017/03/07 Javascript
微信小程序之电影影评小程序制作代码
2017/08/03 Javascript
React props和state属性的具体使用方法
2018/04/12 Javascript
jQuery实现文件编码成base64并通过AJAX上传的方法
2018/04/12 jQuery
nodejs 十六进制字符串型数据与btye型数据相互转换
2018/07/30 NodeJs
详解vue配置后台接口方式
2019/03/29 Javascript
如何在微信小程序里面退出小程序的方法
2019/04/28 Javascript
微信小程序引入Vant组件库过程解析
2019/08/06 Javascript
[54:56]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第三局
2016/03/06 DOTA
[48:26]VGJ.S vs infamous Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
[01:01:35]Optic vs paiN 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[49:21]完美世界DOTA2联赛循环赛 Ink Ice vs LBZS BO2第二场 11.05
2020/11/06 DOTA
ssh批量登录并执行命令的python实现代码
2012/05/25 Python
Python 的类、继承和多态详解
2017/07/16 Python
浅谈使用Python内置函数getattr实现分发模式
2018/01/22 Python
python中for用来遍历range函数的方法
2018/06/08 Python
flask入门之文件上传与邮件发送示例
2018/07/18 Python
10款最佳Python开发工具推荐,每一款都是神器
2020/10/15 Python
CSS3让登陆面板3D旋转起来
2016/05/03 HTML / CSS
Jdbc数据访问技术面试题
2012/03/30 面试题
物业门卫岗位职责
2013/12/28 职场文书
基层干部2014全国两会学习心得体会
2014/03/10 职场文书
疾病防治方案
2014/05/31 职场文书
委托书格式
2014/08/01 职场文书
民警个人对照检查剖析材料
2014/09/17 职场文书
社区元宵节活动总结
2015/02/06 职场文书
年度考核登记表个人总结
2015/03/06 职场文书
Pytorch distributed 多卡并行载入模型操作
2021/06/05 Python
python数字图像处理数据类型及颜色空间转换
2022/06/28 Python