Yii 2.0 出来好长时间了,一直都是看下官方网站,没实践过,今天弄了下图片上传操作。

1创建一个简单的数据表

mysql> desc article;
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| title | varchar(60) | NO | MUL | NULL | |
| image | varchar(100) | NO | | NULL | |
| content | text | NO | | NULL | |
+---------+--------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)

数据表结构很简单:自增ID,文章标题,文章缩略图,文章内容。

2使用Gii生成一个文章表的Model,再生成一个CURD.

gii确实是很好用的工具,简单快速,具体教程可参考下面链接地址。

地址:http://www.yiichina.com/guide/2/start-gii

3 修改模板文件

修改_form.php(添加和修改模板文件公用)

<div class="article-form">

    <?php
$form = ActiveForm::begin([
'id' => "article-form",
'enableAjaxValidation' => false,
'options' => ['enctype' => 'multipart/form-data'],
]);
?> <?= $form->field($model, 'title')->textInput(['maxlength' => 60]) ?>
<?= $form->field($model, 'image')->fileInput() ?>
<?= $form->field($model, 'content')->textarea(['rows' => 6]) ?> <div class="form-group">
<?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div> <?php ActiveForm::end(); ?> </div>

上面代码中,需要注意的就是ActiveForm::begin()方法里面制定的options选项。

参考文件为:yii2\basic\vendor\yiisoft\yii2\widgets\ActiveForm.php,打开看下就明白,指定的选项也就是该类下的静态属性。

4 修改控制器方法

    $model = new Article();
$rootPath = "uploads/";
if (isset($_POST['Article'])) {
$model->attributes = $_POST['Article'];
$image = UploadedFile::getInstance($model, 'image');
$ext = $image->getExtension();
$randName = time() . rand(1000, 9999) . "." . $ext;
$path = abs(crc32($randName) % 500);
$rootPath = $rootPath . $path . "/";
if (!file_exists($path)) {
mkdir($rootPath,true);
}
$image->saveAs($rootPath . $randName);
$model->image = $rootPath.$randName; if ($model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
}
} else {
return $this->render('create', [
'model' => $model,
]);
}
}

该action中,首先调用UploadedFile::getInstance(),返回一个实例化对象。

通过getExtension()获取文件后缀名,然后随机生成一个文件名,即$randName。

然后为了多目录存储,使用了crc32函数。

最后直接调用saveAs()方法保存文件。

至此大功告成。

参考文件:yii2\basic\vendor\yiisoft\yii2\web\UploadedFile.php

ps:最后Yii 2.0使用了php新版本命名空间等,控制器文件头部记得use下就ok了。

yii2.0 文件上传的更多相关文章

  1. Servlet3.0文件上传

    Servelt3.0文件上传作为一种便捷的文件上传方式很是值得我们去应用的 1.Servlet3.0文件上传使用步骤 浏览器端的要求 表单的提交方法必须是post 必须有一个文件上传组件 <in ...

  2. PHPcms v9.6.0 文件上传漏洞

    title: PHPcms v9.6.0 文件上传漏洞 date: 2021-4-5 tags: 渗透测试,CVE漏洞复现,文件上传 categories: 渗透测试 CVE漏洞复现 文件上传 PHP ...

  3. 【代码审计】UKCMS_v1.1.0 文件上传漏洞分析

      0x00 环境准备 ukcms官网:https://www.ukcms.com/ 程序源码下载:http://down.ukcms.com/down.php?v=1.1.0 测试网站首页: 0x0 ...

  4. java servlet 3.0文件上传

    在以前,处理文件上传是一个很痛苦的事情,大都借助于开源的上传组件,诸如commons fileupload等.现在好了,很方便,便捷到比那些组件都方便至极.以前的HTML端上传表单不用改变什么,还是一 ...

  5. servlet3.0文件上传与下载

    描述:文件上传与下载是在JavaEE中常见的功能,实现文件上传与下载的方式有多种,其中文件上传的方式有: (1)commons-fileupload: (2)Servlet 3.0 实现文件上传 (3 ...

  6. Android Retrofit 2.0文件上传

    Android Retrofit 实现(图文上传)文字(参数)和多张图片一起上传 使用Retrofit进行文件上传,肯定离不开Part & PartMap. public interface ...

  7. NetCore3.0 文件上传与大文件上传的限制

    NetCore文件上传两种方式 NetCore官方给出的两种文件上传方式分别为“缓冲”.“流式”.我简单的说说两种的区别, 1.缓冲:通过模型绑定先把整个文件保存到内存,然后我们通过IFormFile ...

  8. yii2.0 图片上传(摘录)

    文章来源:http://blog.sina.com.cn/s/blog_88a65c1b0101izmn.html 下面小伙就带领大学学习一下 Yii2.0 的图片上传类的使用,还是老样子,如果代码样 ...

  9. yii2.0图片上传

    在根目录下夹uploads文件夹 控制器 UploadController.php <?php namespace frontend\controllers; use Yii; use fron ...

随机推荐

  1. 有趣iOS开展 - 网络请求

    网络请求 $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split(' ...

  2. Swift中文教程(一)--欢迎来到Swift的世界

    原文:Swift中文教程(一)--欢迎来到Swift的世界 Apple凌晨时在WWDC发布了Swift编程语言,语法简介我很喜欢,市面上没有完整的中文教程,我在ibooks里面下载了英文原版,现在开始 ...

  3. 数据传输对象(DTO)介绍及各类型实体比较

    数据传输对象(DTO)介绍及各类型实体比较 本文将介绍DDD分层架构中广泛使用的数据传输对象Dto,并且与领域实体Entity,查询实体QueryObject,视图实体ViewModel等几种实体进行 ...

  4. 深入理解C指针之二:C内存管理

    原文:深入理解C指针之二:C内存管理 内存管理对所有程序来说都很重要.有时候内存由运行时系统隐式的管理,比如为变量自动分配内存.在这种情况下,变量分配在它所处的函数的栈帧上(每个函数都有它自己的栈帧, ...

  5. KnockOut绑定

    KnockOut绑定之Click绑定 Click绑定对DOM元素添加一个函数,当DOM元素被点击的时候调用.在button,input 或者a标签中常用,但其实他适用于任何可见的DOM元素. exam ...

  6. 记录近期小改Apriori至MapReduce上的心得

    ·背景 前一阵,一直在研究一些ML的东东,后来工作关系暂停了一阵.现在继续把剩下一些热门的算法再吃吃透,"无聊+逗比"地把他们搞到MapReduce上.这次选择的入手对象为Apri ...

  7. Swift入门教程:基本语法(三)

    打印输出 Swift提供了2个打印输出函数 println :输出内容后会自动换行 print :对比println,少了个自动换行的功能 示例 输出字符串 println("欢迎学习传智播 ...

  8. ftk学习记录(IME文章)

    [声明:版权全部,欢迎转载.请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 前面说的是全屏设置,还是请大家看一下效果图. watermark/2/text/aHR0cDovL ...

  9. webkit的几个属性

    -webkit-text-size-adjust 1.当样式表里font-size<12px时,中文版chrome浏览器里字体显示仍为12px,这时可以用 html{-webkit-text-s ...

  10. JS模块与命名空间的介绍

    起因将代码组织到类中的一个重要原因是让代码更加“模块化”,可以在很多不同的场景中实现代码的重用.但类不是唯一的模块化代码的方式. 一般来讲,模块是一个独立的JS文件.模块文件可以包含一个类定义.一组相 ...