yii2的上传只需这一篇技术文就足够了

不少新人对上传这种操做有些惧怕、摸不着头脑,今天阿北带你学习一边yii2 UploadFile类,看看yii2如何帮你轻松的完成上传操做。php

老样子,先来个目录html

  • 初步熟悉UploadedFile类web

  • 从Model开始的上传数据库

  • 没有Model的上传数组

UploadedFile类

UploadedFile类位于 vendor/yiisoft/yii2/web/UploadedFile.php服务器

它提供了好比 getInstancegetInstancesgetInstanceByNamesaveAs等诸多方法
详情能够参考速查表 http://nai8.me/tool-sc.html#s...yii2

从Model开始的上传

咱们先来设计一个简单的会员表,实现对其头像的上传功能。app

图片描述

而后咱们新建一个action并写下以下代码。yii

// @app/FileController.php
public function actionIndex(){
    $model = User::findOne(1);
    if(Yii::$app->request->isPost){
        $file = UploadedFile::getInstance($model,'avatar');
        var_dump($file);
    }

    return $this->render('index',[
        'model'=>$model
    ]);
    // 视图里代码 <?= $form->field($model,'avatar')->fileInput();?>
}

其实UploadedFile只是对上传文件信息的再次封装并提供一组用于操做该文件的方法,就像上面代码同样,咱们将对UploadedFile获取的上传对象进行打印,看看它究竟是什么?ide

在这里咱们使用yii2-debug来观察这一切。

图片描述

而经过UploadedFile::getInstance接收后造成的对象 $file 以下图

图片描述

在这里你看到了,对于UploadedFile对象,它的属性和上传文件的信息一致,咱们暂时认为 $file = 上传文件 + 一些方法,而且它能够像正常Model接收数据同样获取上传的文件。

既然咱们已经获得了文件,它就在$file,那么如今咱们将它保存到指定的目录就行了。

这要用到 UploadedFile 提供的saveAs方法,固然在这里你也能够用 getExtension 获取文件扩展名等等。

可是要注意,此刻咱们操做的是一个具体的对象,saveAs是保存这个文件、getExtension是得到此文件的扩展名,这些都是对象方法,不是静态方法,初学者自行体会。

// 继续编写actionIndex
...
if(Yii::$app->request->isPost){
    $file = UploadedFile::getInstance($model,'avatar');
    $path = 'data/'.time().".".$file->getExtension();
    if($file->saveAs(Yii::getAlias("@webroot").'/'.$path) === true){
        $model->avatar = $path;
    }
    $model->update();
}
...

要注意的是,saveAs的参数是一个服务器物理路径。

执行后,我数据库中已经有了该头像的相对路径。

图片描述

固然这是最简单的,你也能够经过Model的rules 或 action本身的逻辑实现对文件的验证,好比扩展名、好比大小、好比等等。

这一切貌似很轻松就完成了,咱们再也不用去处理蹩脚的原生PHP上传文件,可是有几种特殊状况还须要说下。

如何一下上传并接受多个文件

好比个人user增长了一列identity_card,表明身份证,我如今要用来存放身份证的正反面图片

按照上面的需求,视图确定是要变更下,将identity_card变为一个数组

<?= $form->field($model,'identity_card[]')->fileInput();?>
<?= $form->field($model,'identity_card[]')->fileInput();?>

而后咱们使用 UploadedFile::getInstances来完成,核心代码以下

...
if(Yii::$app->request->isPost){
    $files = UploadedFile::getInstances($model,'identity_card'); // 不是identity_card[]
    var_dump($files);
}
...

getInstances能帮咱们接收一个数组类型的fileInput,看看结果

图片描述

而后咱们能够对这个$files结果集进行遍历等操做,据具体场景而定便可。

没有Model的上传

上面都是经过一个模型来接收客户传递过来的文件,它很方便,咱们接下来介绍下jie'sho不经过Model如何去处理一个文件或一组文件上传接收问题。

在这里我不计划写任何代码,给你们一个图,也许明白的够透彻。

图片描述

话说其实 getInstanceByNamegetInstancesByName才是UploadedFile真正核心的函数,getInstance和getInstances最后也是调用了它们。

如今你会了么?接收一个或一组文件。

还有些小细节

getBaseName()

该函数能获取上传文件的原始名,须要注意的是返回的名字不包含扩展名。

getExtension()

该函数能够获取上传文件的扩展名,好比一个文件为a.png,则该函数返回的是png而不是image/png,另外扩展名均处理为小写了已经。

几个变量

另外若是咱们也能够直接调用一些变量

  • type 返回好比image/png这样的媒体类型

  • size 返回文件的大小

  • name 文件原始名(含扩展名)

  • tempName 系统存放文件的临时名

以上就是UploadedFile的全部用法和一些变量,但愿对你有用。

更多yii2技术干货 欢迎来到个人小站 http://nai8.me

相关文章
相关标签/搜索