本文实例讲述了Yii框架实现图片上传的方法。分享给大家供大家参考,具体如下:
今天在网上看了下有关图片上传的教程,历经挫折才调试好,现在把相关代码及其说明贴出来,以供初次使用的朋友们参考。
Model:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?php class Upload extends CActiveRecord { public $image ; public static function model( $className = __CLASS__ ) { return $className ; } public function tableName() { return '{{resource}}' ; } public function rules() { return array ( array ( 'image' , 'file' , 'types' => 'jpg, gif, png' ) ); } } |
注:resource为数据表,表前缀可在main.php内设置,相信朋友们在看到文件上传时应该熟悉了main.php位置在哪及运作机制。
Controller:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<?php class UploadController extends Controller { public function actionIndex() { $model = new Upload; 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:
1
2
3
4
5
|
<meta charset= "utf-8" > <?php echo CHtml::form(SITE_URL . 'admin/upload/index' , 'post' , array ( 'enctype' => 'multipart/form-data' )); ?> <?php echo CHtml::activeFileField( $model , 'image' ); ?> <?php echo CHtml::submitButton( '提交' );?> <?php echo CHtml::endForm(); ?> |
注:上面的SITE_URL为项目定义的常量,也就是项目的网址
相信经过上述步骤,朋友们应该可以上传成功图片,而且在项目下的assets目录下找到上传的图片。因为发现yii没有缩略图的方法,于是把thinkphp缩略图的方法整合了进来,把下面代码保存为Image.php放在项目下的protected/extensions目录下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
<?php class Image extends CController { /** +---------------------------------------------------------- * 取得图像信息 * +---------------------------------------------------------- * @static * @access public +---------------------------------------------------------- * @param string $image 图像文件名 +---------------------------------------------------------- * @return mixed +---------------------------------------------------------- */ static function getImageInfo( $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 { return false; } } /** +---------------------------------------------------------- * 生成缩略图 +---------------------------------------------------------- * @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 +---------------------------------------------------------- */ static function thumb( $image , $thumbname , $type = '' , $maxWidth =200, $maxHeight =50, $interlace =true) { // 获取原图信息 $info = Image::getImageInfo( $image ); if ( $info !== false) { $srcWidth = $info [ 'width' ]; $srcHeight = $info [ 'height' ]; $type = empty ( $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 )) { return false; } $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 ; } return false; } } ?> |
再在项目下的protected/config/main.php中import字段加上
1
2
3
4
5
6
|
// autoloading model and component classes 'import' => array ( 'application.models.*' , 'application.components.*' , 'application.extensions.*' , #加上此行,意思为自动载入 ), |
再上面的Controller加上
1
2
3
4
5
6
7
8
9
10
11
12
|
public function actionIndex() { $model = new Upload; 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程序设计有所帮助。