本文档教授大家在yii2.0里实现文件上传 首先我们来实现单文件上传
第一步 首先建立一个关于上传的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里实现文件上传 首先我们来实现单文件上传的更多相关文章
- yii2.0里的redirect跳转方法
在yii2框架里难免会出现跨控制器跳转,调用方法等,这就用到了redirect了, 带参数的 $control=Yii::app()->runController('site/show/id/2 ...
- yii2.0里自己写的源码上传图片
在做项目过程中,用了源码表单上传, <form action="?r=pre/create" method="post" enctype="mu ...
- 解决yii2.0里url重写引用js路径问题(@web/的用法)
在实际项目中,为了seo优化,使用了伪静态,开启了url重写
- yii2.0里别名的定义
别名用来表示文件路径和URL,为了避免在代码中硬编码一些绝对路径和URL,一个别名必须以‘@’符开头. 用Yii::setAlias()的方法来设置: //文件别名 Yii::setAlias('@f ...
- yii2.0 在save保存之前的操作(放在模型model文件内)
public function beforeSave($insert){ if(parent::beforeSave($insert)) { if($insert) { } else { } retu ...
- PHP框架Yii2.0安装(基础版、高级版)
最近农成也是切入了yiiframework 2.0,就是安装yii2.0就花费了不少的时间,为此做了很多的弯路,特此写一篇博文来给后面学习的同学少走一点的弯路.写的不好的地方欢迎各位学习的同学们能够指 ...
- Yii2.0 自动生成 model 层
yii2.0 里一个表对应一个model,可以自动生成 前台使用的model在frontend(backend)/web目录下的gii生成例如(www.liqiuyue.com/yii /fronte ...
- .NET5.0 单文件发布打包操作深度剖析
.NET5.0 单文件发布打包操作深度剖析 前言 随着 .NET5.0 Preview 8 的发布,许多新功能正在被社区成员一一探索:这其中就包含了"单文件发布"这个炫酷的功能,实 ...
- Yii2.0 依赖注入(DI)和依赖注入容器的原理
依赖注入和依赖注入容器 为了降低代码耦合程度,提高项目的可维护性,Yii采用多许多当下最流行又相对成熟的设计模式,包括了依赖注入(Denpdency Injection, DI)和服务定位器(Serv ...
随机推荐
- css的再深入8(更新中···)
1.去滚动条的属性 overflow:hidden; overflow-x:hidden; 水平超出的隐藏. 2.z-index 层次叠加 元素重叠 谁的值大谁在上面 (1) 父级出现position ...
- windows(xshell)免密码登录
windows(xshell)免密码登录 第一步生成密钥文件 打开xshell 选个工具栏的工具如下图 选择密钥类型和长度,如下图 密钥会自动生成,如下图,点击下一步即可 设置给密钥加密的密码也可以不 ...
- sublime汉化
1.打开sublime使用快捷键 shift+ctrl+p调出package control; 2.键入Package Control:install package 会弹出一个输入框,然后再搜索lo ...
- JS实时获取输入框中的值
实时获取input输入框中的值需要oninput和onpropertychange属性来实现.原因是onpropertychange属性为IE专属,而oninput属性支持大部分浏览器包括IE9及以上 ...
- 一个完整的成年果蝇大脑的电子显微镜图谱 | A Complete Electron Microscopy Volume of the Brain of Adult Drosophila melanogaster
paper:A Complete Electron Microscopy Volume of the Brain of Adult Drosophila melanogaster 果蝇是一个非常完美的 ...
- vue 上拉加载自定义组件,超好用哦
1.创建组件components > zj-roll > index.vue <template> <div> <slot></slot> ...
- RabittMQ安装和Erlang安装教程
安装Erlang 官方安装地址文档: http://www.rabbitmq.com/install-rpm.html 根据官网的推荐 进入到专为RabbitMQ整理的极简版Erlang https: ...
- 八大排序算法——插入排序(动图演示 思路分析 实例代码java 复杂度分析)
一.动图演示 二.思路分析 例如从小到大排序: 1. 从第二位开始遍历, 2. 当前数(第一趟是第二位数)与前面的数依次比较,如果前面的数大于当前数,则将这个数放在当前数的位置上,当前数的下标-1 ...
- MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.3 Displaying Classes in a Layer
MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.3 Displaying Classes in a Layer 一.前言 关于第一节的 ...
- 脚本自动部署及监控 web
1.编写脚本自动部署反向代理.web.nfs: I.部署nginx反向代理两个web服务,调度算法使用加权轮询 II.所有web服务使用共享存储nfs,保证所有web都对其有读写权限,保证数据一致性: ...