查看: 1725|回复: 0

[PHP学习] Yii框架实现图片上传的方法详解

发表于 2018-3-31 08:00:03

本文实例讲述了Yii框架实现图片上传的方法。分享给大家供大家参考,具体如下:

今天在网上看了下有关图片上传的教程,历经挫折才调试好,现在把相关代码及其说明贴出来,以供初次使用的朋友们参考。

Model:

  1. <?php
  2. class Upload extends CActiveRecord {
  3. public $image;
  4. public static function model($className = __CLASS__) {
  5. return $className;
  6. }
  7. public function tableName() {
  8. return '{{resource}}';
  9. }
  10. public function rules() {
  11. return array(
  12. array('image', 'file', 'types'=>'jpg, gif, png')
  13. );
  14. }
  15. }
复制代码

注:resource为数据表,表前缀可在main.php内设置,相信朋友们在看到文件上传时应该熟悉了main.php位置在哪及运作机制。

Controller:

  1. <?php
  2. class UploadController extends Controller {
  3. public function actionIndex() {
  4. $model=new Upload;
  5. if(isset($_POST['Upload'])) {
  6. $model->image=CUploadedFile::getInstance($model,'image');
  7. $ext = $model->image->getExtensionName();
  8. $fileName = uniqid() . '.' . $ext;
  9. $model->image->saveAs('assets/' . $fileName);
  10. }
  11. $this->renderPartial('index', array('model'=>$model));
  12. }
  13. }
复制代码

注:saveAs里面是存放图片上传后的地址,追踪下代码可以发现,该参数是move_uploaded_file函数的第二个参数,一定得是文件名。

View:

  1. <meta charset="utf-8">
  2. <?php echo CHtml::form(SITE_URL . 'admin/upload/index','post',array('enctype'=>'multipart/form-data')); ?>
  3. <?php echo CHtml::activeFileField($model, 'image'); ?>
  4. <?php echo CHtml::submitButton('提交');?>
  5. <?php echo CHtml::endForm(); ?>
复制代码

注:上面的SITE_URL为项目定义的常量,也就是项目的网址

相信经过上述步骤,朋友们应该可以上传成功图片,而且在项目下的assets目录下找到上传的图片。因为发现yii没有缩略图的方法,于是把thinkphp缩略图的方法整合了进来,把下面代码保存为Image.php放在项目下的protected/extensions目录下

  1. <?php
  2. class Image extends CController {
  3. /**
  4. +----------------------------------------------------------
  5. * 取得图像信息
  6. *
  7. +----------------------------------------------------------
  8. * @static
  9. * @access public
  10. +----------------------------------------------------------
  11. * @param string $image 图像文件名
  12. +----------------------------------------------------------
  13. * @return mixed
  14. +----------------------------------------------------------
  15. */
  16. static function getImageInfo($img) {
  17. $imageInfo = getimagesize($img);
  18. if ($imageInfo !== false) {
  19. $imageType = strtolower(substr(image_type_to_extension($imageInfo[2]), 1));
  20. $imageSize = filesize($img);
  21. $info = array(
  22. "width" => $imageInfo[0],
  23. "height" => $imageInfo[1],
  24. "type" => $imageType,
  25. "size" => $imageSize,
  26. "mime" => $imageInfo['mime']
  27. );
  28. return $info;
  29. } else {
  30. return false;
  31. }
  32. }
  33. /**
  34. +----------------------------------------------------------
  35. * 生成缩略图
  36. +----------------------------------------------------------
  37. * @static
  38. * @access public
  39. +----------------------------------------------------------
  40. * @param string $image 原图
  41. * @param string $type 图像格式
  42. * @param string $thumbname 缩略图文件名
  43. * @param string $maxWidth 宽度
  44. * @param string $maxHeight 高度
  45. * @param string $position 缩略图保存目录
  46. * @param boolean $interlace 启用隔行扫描
  47. +----------------------------------------------------------
  48. * @return void
  49. +----------------------------------------------------------
  50. */
  51. static function thumb($image, $thumbname, $type='', $maxWidth=200, $maxHeight=50, $interlace=true) {
  52. // 获取原图信息
  53. $info = Image::getImageInfo($image);
  54. if ($info !== false) {
  55. $srcWidth = $info['width'];
  56. $srcHeight = $info['height'];
  57. $type = empty($type) ? $info['type'] : $type;
  58. $type = strtolower($type);
  59. $interlace = $interlace ? 1 : 0;
  60. unset($info);
  61. $scale = min($maxWidth / $srcWidth, $maxHeight / $srcHeight); // 计算缩放比例
  62. if ($scale >= 1) {
  63. // 超过原图大小不再缩略
  64. $width = $srcWidth;
  65. $height = $srcHeight;
  66. } else {
  67. // 缩略图尺寸
  68. $width = (int) ($srcWidth * $scale);
  69. $height = (int) ($srcHeight * $scale);
  70. }
  71. // 载入原图
  72. $createFun = 'ImageCreateFrom' . ($type == 'jpg' ? 'jpeg' : $type);
  73. if(!function_exists($createFun)) {
  74. return false;
  75. }
  76. $srcImg = $createFun($image);
  77. //创建缩略图
  78. if ($type != 'gif' && function_exists('imagecreatetruecolor'))
  79. $thumbImg = imagecreatetruecolor($width, $height);
  80. else
  81. $thumbImg = imagecreate($width, $height);
  82. //png和gif的透明处理 by luofei614
  83. if('png'==$type){
  84. imagealphablending($thumbImg, false);//取消默认的混色模式(为解决阴影为绿色的问题)
  85. imagesavealpha($thumbImg,true);//设定保存完整的 alpha 通道信息(为解决阴影为绿色的问题)
  86. }elseif('gif'==$type){
  87. $trnprt_indx = imagecolortransparent($srcImg);
  88. if ($trnprt_indx >= 0) {
  89. //its transparent
  90. $trnprt_color = imagecolorsforindex($srcImg , $trnprt_indx);
  91. $trnprt_indx = imagecolorallocate($thumbImg, $trnprt_color['red'], $trnprt_color['green'], $trnprt_color['blue']);
  92. imagefill($thumbImg, 0, 0, $trnprt_indx);
  93. imagecolortransparent($thumbImg, $trnprt_indx);
  94. }
  95. }
  96. // 复制图片
  97. if (function_exists("ImageCopyResampled"))
  98. imagecopyresampled($thumbImg, $srcImg, 0, 0, 0, 0, $width, $height, $srcWidth, $srcHeight);
  99. else
  100. imagecopyresized($thumbImg, $srcImg, 0, 0, 0, 0, $width, $height, $srcWidth, $srcHeight);
  101. // 对jpeg图形设置隔行扫描
  102. if ('jpg' == $type || 'jpeg' == $type)
  103. imageinterlace($thumbImg, $interlace);
  104. // 生成图片
  105. $imageFun = 'image' . ($type == 'jpg' ? 'jpeg' : $type);
  106. $imageFun($thumbImg, $thumbname);
  107. imagedestroy($thumbImg);
  108. imagedestroy($srcImg);
  109. return $thumbname;
  110. }
  111. return false;
  112. }
  113. }
  114. ?>
复制代码

再在项目下的protected/config/main.php中import字段加上

  1. // autoloading model and component classes
  2. 'import'=>array(
  3. 'application.models.*',
  4. 'application.components.*',
  5. 'application.extensions.*', #加上此行,意思为自动载入
  6. ),
复制代码

再上面的Controller加上

  1. public function actionIndex() {
  2. $model=new Upload;
  3. if(isset($_POST['Upload'])) {
  4. $model->image=CUploadedFile::getInstance($model,'image');
  5. $ext = $model->image->getExtensionName();
  6. $fileName = uniqid() . '.' . $ext;
  7. $model->image->saveAs('assets/' . $fileName);
  8. // 生成缩略图
  9. Image::thumb('assets/' . $fileName, 'assets/' . uniqid() . '.' . $ext);
  10. }
  11. $this->renderPartial('index', array('model'=>$model));
  12. }
复制代码

这次就完整了。

更多关于Yii相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。



回复

使用道具 举报