yii2.0 文件上传
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 文件上传的更多相关文章
- Servlet3.0文件上传
Servelt3.0文件上传作为一种便捷的文件上传方式很是值得我们去应用的 1.Servlet3.0文件上传使用步骤 浏览器端的要求 表单的提交方法必须是post 必须有一个文件上传组件 <in ...
- PHPcms v9.6.0 文件上传漏洞
title: PHPcms v9.6.0 文件上传漏洞 date: 2021-4-5 tags: 渗透测试,CVE漏洞复现,文件上传 categories: 渗透测试 CVE漏洞复现 文件上传 PHP ...
- 【代码审计】UKCMS_v1.1.0 文件上传漏洞分析
0x00 环境准备 ukcms官网:https://www.ukcms.com/ 程序源码下载:http://down.ukcms.com/down.php?v=1.1.0 测试网站首页: 0x0 ...
- java servlet 3.0文件上传
在以前,处理文件上传是一个很痛苦的事情,大都借助于开源的上传组件,诸如commons fileupload等.现在好了,很方便,便捷到比那些组件都方便至极.以前的HTML端上传表单不用改变什么,还是一 ...
- servlet3.0文件上传与下载
描述:文件上传与下载是在JavaEE中常见的功能,实现文件上传与下载的方式有多种,其中文件上传的方式有: (1)commons-fileupload: (2)Servlet 3.0 实现文件上传 (3 ...
- Android Retrofit 2.0文件上传
Android Retrofit 实现(图文上传)文字(参数)和多张图片一起上传 使用Retrofit进行文件上传,肯定离不开Part & PartMap. public interface ...
- NetCore3.0 文件上传与大文件上传的限制
NetCore文件上传两种方式 NetCore官方给出的两种文件上传方式分别为“缓冲”.“流式”.我简单的说说两种的区别, 1.缓冲:通过模型绑定先把整个文件保存到内存,然后我们通过IFormFile ...
- yii2.0 图片上传(摘录)
文章来源:http://blog.sina.com.cn/s/blog_88a65c1b0101izmn.html 下面小伙就带领大学学习一下 Yii2.0 的图片上传类的使用,还是老样子,如果代码样 ...
- yii2.0图片上传
在根目录下夹uploads文件夹 控制器 UploadController.php <?php namespace frontend\controllers; use Yii; use fron ...
随机推荐
- 从Ubuntu12.04升级到Ubuntu 14.04之后,系统将无法启动
进入Ubuntu启动界面.通常有几个选项,Ubuntu,Ubuntu先进... 输入e键,进入grub的设置界面.将里面的ro改动为rw就可以. 以上能够启动,临时性的设置 可是为了永久保存这个设置, ...
- iOS8开发~UI布局(二)storyboard中autolayout和size class的使用具体解释
一.概要:前一篇初步的描写叙述了size class的概念,那么实际中怎样使用呢,以下两个问题是我们一定会遇到的: 1.Xcode6中添加了size class,在storyboard中怎样使用? 2 ...
- Google软件构建工具Bazel
转载Google软件构建工具Bazel FAQ 本文是我的翻译,原文在这里.欢迎转载,转载请注名本文作者和原始链接注:如果想了解Bazel的原理,可以看看我之前翻译的Google Blaze原理及使用 ...
- bootstrap标准模板
<!DOCTYPE html><!--html5定义--> <html lang="en"> <head> <meta cha ...
- APMServ—我用过的最优秀的PHP集成环境工具
原文:APMServ-我用过的最优秀的PHP集成环境工具 经常折腾wordpress和各种cms,免不了要在本地测试一些程序,所以选择一款好的php集成环境就至关重要啦. 1. 我用过的php集成环境 ...
- MVC自定义过滤器,自定义Area过滤器,自定义Controller,Action甚至是ViewData过滤器
实现MVC自定义过滤器,自定义Area过滤器,自定义Controller,Action甚至是ViewData过滤器 MVC开发中几种以AOP方式实现的Filters是非常好用的,默认情况下,我们通过A ...
- PHP通过传递对象参数调用asp.net Webservice 服务
asp.net 测试服务 ProcessRequest.asmx文件代码 public class ProcessRequest : System.Web.Services.WebService ...
- MS SQL Server递归查询
原文:MS SQL Server递归查询 刚才在论坛上看到网友一个要求.参考如下,Insus.NET分析一下,可以使用MS SQL Server的递归查询,得到结果.准备一张表: 根据网友提供的数据, ...
- 将已有的工程项目添加到Xcode到Git管理中
在Xcode中创建工程的时候,我们很容易的可以将新创建的工程添加到Git中,如图: 但是如果是本地已经有的工程,那该如何添加到Git中呢? 首先终端进入到该工程的目录. 然后: git init gi ...
- Git基础教程
Git是一个分布式的版本控制工具,本篇文章从介绍Git开始,重点在于介绍Git的基本命令和使用技巧,让你尝试使用Git的同时,体验到原来一个版 本控制工具可以对开发产生如此之多的影响,文章分为两部分, ...