第一步  首先建立一个关于上传的model层  如果你有已经建好的可以使用表单小部件的model层 也可以直接用这个。在这里我们新建一个新的model层

在model层新建文件  Upload.php

<?php
/**
 * Created by PhpStorm.
 * User: jinlei
 * Date: 2017/2/14
 * Time: 9:36
 */

namespace frontend\models;

use yii\base\Model;
use yii\widgets\ActiveForm;
use yii\helpers\Html;
use yii\web\UploadedFile;

class Upload extends Model
{
       public $file;

public function rules(){
            return [

];
        }

public  function attributeLabels(){
            return[
                'file'=>'文件上传',
            ];

}
}

第二步   在控制器层,引用我们刚刚创建好的这个model  在这里我 们使用一个已经创建好的控制器。复习一下怎么在一个控制器里使用两个或者两个以上的model

首先在我们的控制器里边 使用我们刚刚创建的model

use frontend\models\Upload;

然后新建一个方法  实现model层和view层的连接

public function actionUpload(){
        $up = new Upload();
        return $this->render('upload',['model'=>$up]);

}

然后新建视图层

<?php
/**
 * Created by PhpStorm.
 * User: jinlei
 * Date: 2017/2/14
 * Time: 9:46
 */

use yii\widgets\ActiveForm;
?>

<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data'],
    'action'=>'?r=index/doupload',
    'method'=>'post',
])
?>

<?= $form->field($model, 'file')->fileInput() ?>

<button>Submit</button>

<?php ActiveForm::end() ?>

下一步  试图层创建好以后  就可以写文件上传的代码了

在这里因为我们定义了把文件上传到index/doupload 这个方法里

所以我们在控制器里新建一个doupload的方法

在这里要注意 因为我们使用了上传类 所以需要use一下这个上传类

use yii\web\UploadedFile;

public function  actionDoupload(){

if (Yii::$app->request->isPost) {
            $model = new Upload();
            $model->file = UploadedFile::getInstance($model, 'file');

if ($model->file && $model->validate()) {
                $model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension);
            }
        }

现在已经实现了文件上传  但是要注意  如果报下边的错误

move_uploaded_file(uploads/1501PHPA 考试信息.xlsx): failed to open stream: No such file or directory

默认情况下只需要在入口文件同级的目录下  新建一个文件夹  uploads

下边 我们实现多文件 上传  只需要稍微坐下修改

首先修改views  让表单小部件 支持多文件

<?= $form->field($model, 'file[]')->fileInput(['multiple' => true]) ?>

接下来修改下控制器中的上传代码  让我们的控制器也支持多文件 就可以了

public function  actionDoupload(){

/*if (Yii::$app->request->isPost) {*/
            $model = new Upload();
            /*$model->file = UploadedFile::getInstance($model, 'file');

if ($model->file && $model->validate()) {
                $model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension);
            }*/
            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);
                    }
                }
            }

Ok  文件上传 就完成了

如果想要限制文件大小

第一种方法 在我们的规则里边进行限制

public function rules(){
            return [
             [['file'],'file','maxSize'=>1024*200,'minSize'=>1024*20]
            ];
        }

以上就是限制文件上传最大值是20kb

但是  以上的限制是通过js实现的  当我们禁用js后  就会有很大的危险  所以 还有添加 后台的验证 这里只做了尺寸大小的验证
修改了上传部分的代码

public function  actionDoupload(){
        if (\Yii::$app->request->isPost) {
            $model = new Upload();
            $model->file = UploadedFile::getInstance($model, 'file');
            $filesize = $model->file->size;
            $maxsize = 1024*200;
            $minsize = 1024*20;
            if($filesize>$maxsize || $filesize<$minsize){
                die("size is wrong");
            }
            if ($model->file && $model->validate()) {
                $model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension);
            }

}

不用建上传model层的方法

自己所生成的model 的 class下加上  public $file

//在控制器下写入 ,写在哪不用我说了吧;
   use yii\web\UploadedFile;

控制器下的方法内写入

$model=new \frontend\models\你自己的Molde名字();
        if (Yii::$app->request->isPost) {//判断是否是post传值
            $model->file = UploadedFile::getInstance($model, '你的数据库存储图片的字段叫什么这里就写什么');

if ($model->file && $model->validate()) {
                //前提是 需要在  web目录下建一个upload文件夹
                //将上传过来的图片移动到上面所说的新建的upload文件夹中
                $model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension);
                //拼接出一个 你需要存储到数据库的图片(包含路径)
                $img='uploads/' . $model->file->baseName . '.' . $model->file->extension;
                //下面三行是入库的一些代码可以忽视
                $adress=\yii::$app->request->post();
                $data=array('adress'=>$adress['Tourism']['adress'],'area'=>$adress['Tourism']['area'],'img'=>$img);
                $res=$model->add($data);
              
            }

本文档教授大家在yii2.0里实现文件上传 首先我们来实现单文件上传的更多相关文章

  1. yii2.0里的redirect跳转方法

    在yii2框架里难免会出现跨控制器跳转,调用方法等,这就用到了redirect了, 带参数的 $control=Yii::app()->runController('site/show/id/2 ...

  2. yii2.0里自己写的源码上传图片

    在做项目过程中,用了源码表单上传, <form action="?r=pre/create" method="post" enctype="mu ...

  3. 解决yii2.0里url重写引用js路径问题(@web/的用法)

    在实际项目中,为了seo优化,使用了伪静态,开启了url重写

  4. yii2.0里别名的定义

    别名用来表示文件路径和URL,为了避免在代码中硬编码一些绝对路径和URL,一个别名必须以‘@’符开头. 用Yii::setAlias()的方法来设置: //文件别名 Yii::setAlias('@f ...

  5. yii2.0 在save保存之前的操作(放在模型model文件内)

    public function beforeSave($insert){ if(parent::beforeSave($insert)) { if($insert) { } else { } retu ...

  6. PHP框架Yii2.0安装(基础版、高级版)

    最近农成也是切入了yiiframework 2.0,就是安装yii2.0就花费了不少的时间,为此做了很多的弯路,特此写一篇博文来给后面学习的同学少走一点的弯路.写的不好的地方欢迎各位学习的同学们能够指 ...

  7. Yii2.0 自动生成 model 层

    yii2.0 里一个表对应一个model,可以自动生成 前台使用的model在frontend(backend)/web目录下的gii生成例如(www.liqiuyue.com/yii /fronte ...

  8. .NET5.0 单文件发布打包操作深度剖析

    .NET5.0 单文件发布打包操作深度剖析 前言 随着 .NET5.0 Preview 8 的发布,许多新功能正在被社区成员一一探索:这其中就包含了"单文件发布"这个炫酷的功能,实 ...

  9. Yii2.0 依赖注入(DI)和依赖注入容器的原理

    依赖注入和依赖注入容器 为了降低代码耦合程度,提高项目的可维护性,Yii采用多许多当下最流行又相对成熟的设计模式,包括了依赖注入(Denpdency Injection, DI)和服务定位器(Serv ...

随机推荐

  1. dijkstral改编

    题意:给你包含n个点的连通图,每个点都有一个权值.给定起点和终点.问你起点到终点的最短路条数,并且输出路径最短且权值之和最大的一条路径. 思路:1.如何根据父节点更新子节点.x,y是父子节点.如果从起 ...

  2. Python3 tkinter基础 Radiobutton indicatoron 长条形 pack 充满一行

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  3. [转载]Black-Scholes 模型中 d1,d2 是怎么得到的?如何理解 Black-Scholes 模型?

    https://www.optbbs.com/thread-253244-1-1.html

  4. EF Core

    一个事务中    先在数据库查出一条数据进行修改      然后在进行查询  他会直接在内存中找到这条数据  不会再数据库查询了 EF Core的 linq语句中可以使用C#方法或函数   在EF6或 ...

  5. SR-IOV虚拟机的MTU与物理网卡的MTU

    在进行SR-IOV虚拟机MTU方面的测试时,出现如下情况: 1)物理网卡PF的MTU值是4000: root@compute-1:~# ip l|more1: lo: <LOOPBACK,UP, ...

  6. js中Undefined 和 Null的区别

    Undefined 和 Null Undefined 这个值表示变量不含有值. 可以通过将变量的值设置为 null 来清空变量. <!DOCTYPE html> <html> ...

  7. 【Oracle】【8】大批量update某个字段

    正文: 需实现:将A表的某个字段的值复制到B表中 我们一般会这样写:UPDATE B SET B.NAME = (SELECT A.NAME FROM A WHERE A.NO = B.NO) 出现的 ...

  8. Python学习——多线程,异步IO,生成器,协程

    Python的语法是简洁的,也是难理解的. 比如yield关键字: def fun(): for i in range(5): print('test') x = yield i print('goo ...

  9. Mysql优化系列之——优化器对子查询的处理

    根据子查询的类型和位置不同,mysql优化器会对查询语句中的子查询采取不同的处理策略,其中包括改写为连接(join),改写为半连接(semi-join)及进行物化处理等. 标量子查询(Scalar S ...

  10. 微信小程序onLaunch修改globalData的值

    //app.js App({ onLaunch: function (options) { //设置场景值到缓存中: //wx.setStorageSync("scene", op ...