摘要:老样子,先来个目录初步熟悉UploadedFile类从Model开始的上传没有Model的上传UploadedFile类UploadedFile类位于 vendor/yiisoft/yii2/web/UploadedFile.php它提供了比如getInstance、getInstances、getInstanceByNam ...
老样子,先来个目录
初步熟悉UploadedFile类
从Model开始的上传
没有Model的上传
UploadedFile类
UploadedFile类位于 vendor/yiisoft/yii2/web/UploadedFile.php
它提供了比如 getInstance、getInstances、getInstanceByName、saveAs等诸多方法 详情可以参考速查表 http://nai8.me/tool-sc.html#section-23
从Model开始的上传
我们先来设计一个简单的会员表,实现对其头像的上传功能。
然后我们新建一个action并写下如下代码。
// @app/FileController.phppublic 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获取的上传对象进行打印,看看它到底是什么?
在这里我们使用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如何去处理一个文件或一组文件上传接收问题。
在这里我不计划写任何代码,给大家一个图,也许明白的够透彻。
话说其实 getInstanceByName、getInstancesByName才是UploadedFile真正核心的函数,getInstance和getInstances最后也是调用了它们。
现在你会了么?接收一个或一组文件。
还有些小细节
getBaseName()
该函数能获取上传文件的原始名,需要注意的是返回的名字不包含扩展名。
getExtension()
该函数可以获取上传文件的扩展名,比如一个文件为a.png,则该函数返回的是png而不是image/png,另外扩展名均处理为小写了已经。
几个变量
另外如果我们也可以直接调用一些变量
type 返回比如image/png这样的媒体类型
size 返回文件的大小
name 文件原始名(含扩展名)
tempName 系统存放文件的临时名
以上就是UploadedFile的所有用法和一些变量,希望对你有用。
以上就是yii2中的文件上传方法的详细内容,更多请关注二当家的素材网其它相关文章!
友情提示:垃圾评论一律封号 加我微信:826096331拉你进VIP群学习群