利用Yii框架实现图片上传
发布:smiling 来源: PHP粉丝网 添加日期:2018-08-06 17:25:16 浏览: 评论:0
本文实例讲述了Yii框架实现图片上传的方法。分享给大家供大家参考,具体如下:
今天在网上看了下有关图片上传的教程,历经挫折才调试好,现在把相关代码及其说明贴出来,以供初次使用的朋友们参考。
Model:
- classUploadextendsCActiveRecord {
- public$image;
- publicstaticfunctionmodel($className=__CLASS__) {
- return$className;
- }
- publicfunctiontableName() {
- return'{{resource}}'
- }
- publicfunctionrules() {
- returnarray(
- array('image','file','types'=>'jpg, gif, png')
- );
- }
- }
注:resource为数据表,表前缀可在main.php内设置,相信朋友们在看到文件上传时应该熟悉了main.php位置在哪及运作机制。
Controller:
- classUploadControllerextendsController {
- publicfunctionactionIndex() {
- $model=newUpload;
- if(isset($_POST['Upload'])) {
- $model->image=CUploadedFile::getInstance($model,'image');
- $ext=$model->image->getExtensionName();
- $fileName= uniqid() .'.'.$ext;
- $model->image->saveAs('assets/'.$fileName);
- }
- $this->renderPartial('index',array('model'=>$model));
- }
- }
注:saveAs里面是存放图片上传后的地址,追踪下代码可以发现,该参数是move_uploaded_file函数的第二个参数,一定得是文件名。
View:
'multipart/form-data'));
注:上面的SITE_URL为项目定义的常量,也就是项目的网址
相信经过上述步骤,朋友们应该可以上传成功图片,而且在项目下的assets目录下找到上传的图片。因为发现yii没有缩略图的方法,于是把thinkphp缩略图的方法整合了进来,把下面代码保存为Image.php放在项目下的protected/extensions目录下.
- classImageextendsCController {
- /**
- +----------------------------------------------------------
- * 取得图像信息
- *
- +----------------------------------------------------------
- * @static
- * @access public
- +----------------------------------------------------------
- * @param string $image 图像文件名
- +----------------------------------------------------------
- * @return mixed
- +----------------------------------------------------------
- */
- staticfunctiongetImageInfo($img) {
- $imageInfo=getimagesize($img);
- if($imageInfo!== false) {
- $imageType=strtolower(substr(image_type_to_extension($imageInfo[2]), 1));
- $imageSize=filesize($img);
- $info=array(
- "width"=>$imageInfo[0],
- "height"=>$imageInfo[1],
- "type"=>$imageType,
- "size"=>$imageSize,
- "mime"=>$imageInfo['mime']
- );
- return$info;
- }else{
- returnfalse;
- }
- }
- /**
- +----------------------------------------------------------
- * 生成缩略图
- +----------------------------------------------------------
- * @static
- * @access public
- +----------------------------------------------------------
- * @param string $image 原图
- * @param string $type 图像格式
- * @param string $thumbname 缩略图文件名
- * @param string $maxWidth 宽度
- * @param string $maxHeight 高度
- * @param string $position 缩略图保存目录
- * @param boolean $interlace 启用隔行扫描
- +----------------------------------------------------------
- * @return void
- +----------------------------------------------------------
- */
- staticfunctionthumb($image,$thumbname,$type='',$maxWidth=200,$maxHeight=50,$interlace=true) {
- // 获取原图信息
- $info= Image::getImageInfo($image);
- if($info!== false) {
- $srcWidth=$info['width'];
- $srcHeight=$info['height'];
- $type=emptyempty($type) ?$info['type'] :$type;
- $type=strtolower($type);
- $interlace=$interlace? 1 : 0;
- unset($info);
- $scale= min($maxWidth/$srcWidth,$maxHeight/$srcHeight);// 计算缩放比例
- if($scale>= 1) {
- // 超过原图大小不再缩略
- $width=$srcWidth;
- $height=$srcHeight;
- }else{
- // 缩略图尺寸
- $width= (int) ($srcWidth*$scale);
- $height= (int) ($srcHeight*$scale);
- }
- // 载入原图
- $createFun='ImageCreateFrom'. ($type=='jpg'?'jpeg':$type);
- if(!function_exists($createFun)) {
- returnfalse;
- }
- $srcImg=$createFun($image);
- //创建缩略图
- if($type!='gif'&& function_exists('imagecreatetruecolor'))
- $thumbImg= imagecreatetruecolor($width,$height);
- else
- $thumbImg= imagecreate($width,$height);
- //png和gif的透明处理 by luofei614
- if('png'==$type){
- imagealphablending($thumbImg, false);//取消默认的混色模式(为解决阴影为绿色的问题)
- imagesavealpha($thumbImg,true);//设定保存完整的 alpha 通道信息(为解决阴影为绿色的问题)
- }elseif('gif'==$type){
- $trnprt_indx= imagecolortransparent($srcImg);
- if($trnprt_indx>= 0) {
- //its transparent
- $trnprt_color= imagecolorsforindex($srcImg,$trnprt_indx);
- $trnprt_indx= imagecolorallocate($thumbImg,$trnprt_color['red'],$trnprt_color['green'],$trnprt_color['blue']);
- imagefill($thumbImg, 0, 0,$trnprt_indx);
- imagecolortransparent($thumbImg,$trnprt_indx);
- }
- }
- // 复制图片
- if(function_exists("ImageCopyResampled"))
- imagecopyresampled($thumbImg,$srcImg, 0, 0, 0, 0,$width,$height,$srcWidth,$srcHeight);
- else
- imagecopyresized($thumbImg,$srcImg, 0, 0, 0, 0,$width,$height,$srcWidth,$srcHeight);
- // 对jpeg图形设置隔行扫描
- if('jpg'==$type||'jpeg'==$type)
- imageinterlace($thumbImg,$interlace);
- // 生成图片
- $imageFun='image'. ($type=='jpg'?'jpeg':$type);
- $imageFun($thumbImg,$thumbname);
- imagedestroy($thumbImg);
- imagedestroy($srcImg);
- return$thumbname;
- }
- returnfalse;
- }
- }
再在项目下的protected/config/main.php中import字段加上
- // autoloading model and component classes
- 'import'=>array(
- 'application.models.*',
- 'application.components.*',
- 'application.extensions.*', #加上此行,意思为自动载入
- ),
再上面的Controller加上
- publicfunctionactionIndex() {
- $model=newUpload;
- if(isset($_POST['Upload'])) {
- $model->image=CUploadedFile::getInstance($model,'image');
- $ext=$model->image->getExtensionName();
- $fileName= uniqid() .'.'.$ext;
- $model->image->saveAs('assets/'.$fileName);
- // 生成缩略图
- Image::thumb('assets/'.$fileName,'assets/'. uniqid() .'.'.$ext);
- }
- $this->renderPartial('index',array('model'=>$model));
- }
这次就完整了。
希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。
Tags: Yii框架 Yii图片上传
相关文章
- ·详解PHP的Yii框架中组件行为的属性注入和方法注入(2019-11-14)
- ·PHP的Yii框架中移除组件所绑定的行为的方法(2019-11-14)
- ·PHP的Yii框架中行为的定义与绑定方法讲解(2019-11-14)
- ·详解在PHP的Yii框架中使用行为Behaviors的方法(2019-11-14)
- ·深入讲解PHP的Yii框架中的属性(Property)(2019-11-17)
- ·解读PHP的Yii框架中请求与响应的处理流程(2019-11-17)
- ·解析PHP的Yii框架中cookie和session功能的相关操作(2019-11-17)
- ·简要剖析PHP的Yii框架的组件化机制的基本知识(2019-11-17)
- ·PHP的Yii框架中YiiBase入口类的扩展写法示例(2019-11-17)
- ·深入解析PHP的Yii框架中的event事件机制(2019-11-17)
- ·全面解读PHP的Yii框架中的日志功能(2019-11-17)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)