yii2 文件上传

本文档教授大家在yii2.0里实现文件上传   首先我们来实现单文件上传


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


在model层新建文件  Upload.php

<?php
/**
 * Created by PhpStorm.
 * User:
 * 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);
            }

            }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值