Yii结合CKEditor实现图片上传功能


Posted in PHP onJune 13, 2014

这几天做的一个项目中需要在所见即所得编辑器中实现图片上传的功能,我因为比较喜欢CKEditor的界面而选择了它。虽然有跟CKEditor配合良好的CKFinder,不过这个东东的功能太复杂,简单看了下CKEdtior的文档,发现这个功能还是可以自己实现而不用借助CKFinder的。

下面代码虽然基于Yii Framework的,但是用其他框架或者语言思路却是完全一样的,有需要的童鞋可以参考一下。

首先要让CkEditor出现图片上传的功能,需要配置编辑器的filebrowserImageUploadUrl属性:

CKEDITOR.replace( 'editor1',
    {
        filebrowserUploadUrl : '/uploader/upload.php',
        filebrowserImageUploadUrl : '/uploader/upload.php?type=Images'
    });

然后在对应的URL上实现图片上传的功能,并向CKEditor返回特定格式的HTML代码,CKEditor就能正常预览并插入图片了。
下面只截取控制器的部分代码,Controller部分我是这样实现的:
/**
 * 保存上传的图片
 *
 * @return string javascript code
 * @author lfyzjck
 **/
public function actionImg($type, $CKEditor, $CKEditorFuncNum, $langCode = 'zh-cn')
{
 if(empty($CKEditorFuncNum) || $type != 'Images'){
  $this->mkhtml($CKEditorFuncNum,'','错误的函数调用');
 }
 if(isset($_FILES['upload'])){
  //获取关于图片上传配置
  $options = Options::model()->findByPk(1);
  $form = new UploadForm('image',$options);
  $form->upload = CUploadedFile::getInstanceByName('upload');
  if($form->validate()){
  //文件名:时间+源文件名
   $target_filename = date('Ymd-hm',time()).$form->upload->getName();
   $path = Yii::app()->basePath.'/../uploads/'.$target_filename;   //图片保存路径
   $form->upload->saveAs($path);
   $this->mkhtml($CKEditorFuncNum,Yii::app()->baseUrl.'/uploads/'.$target_filename, "上传成功");
  }
  else{
   $this->mkhtml($CKEditorFuncNum,'',$form->getError('upload'));
  }
 }
}
/**
 * 返回CKEditor的提示信息
 *
 * @return void
 * @author lfyzjck
 **/
private function mkhtml($fn, $fileurl, $message) 
{
 $str = '';
 exit($str);
}

需要特别说明的mkhtml函数,他会调用CKEditor的函数产生提示信息。上传成功的时候将图片链接返回,CKEditor会根据URL生成图片预览。

然后是UploadForm的代码,这里会验证图片的格式和大小是否符合要求。

class UploadForm extends CFormModel
{
 public $upload;
 private $options;
 private $type;
 public function __construct($type, $options){
  $this->options = $options;
  $this->type = $type;
 }
 /**
  * Declares the validation rules.
  * The rules state that username and password are required,
  * and password needs to be authenticated.
  */
 public function rules()
 {
  return array(
   array('upload', 'file', 
    'types' => $this->options->getAttribute("allow_".$this->type."_type"), 
    'maxSize' => 1024 * (int)$this->options->getAttribute("allow_".$this->type."_maxsize"),
    'tooLarge'=>'文件大小超过限制',
   ),
  );
 }
}
PHP 相关文章推荐
PHP 执行系统外部命令 system() exec() passthru()
Aug 11 PHP
PHPLog php 程序调试追踪工具
Sep 09 PHP
php excel类 phpExcel使用方法介绍
Aug 21 PHP
simplehtmldom Doc api帮助文档
Mar 26 PHP
执行、获取远程代码返回:file_get_contents 超时处理的问题详解
Jun 25 PHP
php结合ajax实现赞、顶、踩功能实例
May 12 PHP
php获取YouTube视频信息的方法
Feb 11 PHP
php商品对比功能代码分享
Sep 24 PHP
Session 失效的原因汇总及解决丢失办法
Sep 30 PHP
php+redis实现注册、删除、编辑、分页、登录、关注等功能示例
Feb 15 PHP
PHP实用小技巧之调用录像的方法
Dec 05 PHP
Laravel相关的一些故障解决
Aug 19 PHP
在Yii框架中使用PHP模板引擎Twig的例子
Jun 13 #PHP
ThinkPHP中U方法的使用浅析
Jun 13 #PHP
PHP实现单例模式最安全的做法
Jun 13 #PHP
PHP5.5和之前的版本empty函数的不同之处
Jun 13 #PHP
PHP输出英文时间日期的安全方法(RFC 1123格式)
Jun 13 #PHP
PHP中多维数组的foreach遍历示例
Jun 13 #PHP
PHP根据传来的16进制颜色代码自动改变背景颜色
Jun 13 #PHP
You might like
实用PHP会员权限控制实现原理分析
2011/05/29 PHP
深入探讨<br />和 \r\n两者有什么区别??
2013/06/05 PHP
PHP使用递归算法无限遍历数组示例
2017/01/13 PHP
php strftime函数的详细用法
2018/06/21 PHP
JavaScript 利用StringBuffer类提升+=拼接字符串效率
2009/11/24 Javascript
Jquery插件easyUi表单验证提交(示例代码)
2013/12/30 Javascript
javascript中处理时间戳为日期格式的方法
2014/01/02 Javascript
jQuery中 delegate使用的问题
2015/07/03 Javascript
javascript设计模式之策略模式学习笔记
2017/02/15 Javascript
JavaScript制作简单的框选图表
2017/05/15 Javascript
Vue指令v-for遍历输出JavaScript数组及json对象的常见方式小结
2019/02/11 Javascript
微信提示 在浏览器打开 效果实现过程解析
2019/09/10 Javascript
基于element-ui封装可搜索的懒加载tree组件的实现
2020/05/22 Javascript
JS removeAttribute()方法实现删除元素的某个属性
2021/01/11 Javascript
[01:32]DOTA2次级联赛——首支职业女子战队选拔赛全记录
2014/10/23 DOTA
python字符串连接的N种方式总结
2014/09/17 Python
在Python中使用matplotlib模块绘制数据图的示例
2015/05/04 Python
基于进程内通讯的python聊天室实现方法
2015/06/28 Python
python3实现SMTP发送邮件详细教程
2018/06/19 Python
python十进制转二进制的详解
2020/02/07 Python
vue常用指令代码实例总结
2020/03/16 Python
python使用dlib进行人脸检测和关键点的示例
2020/12/05 Python
CSS3与动画有关的属性transition、animation、transform对比(史上最全版)
2017/08/18 HTML / CSS
ECCO爱步官方旗舰店:丹麦鞋履品牌
2018/01/02 全球购物
英国建筑用品在线:Building Supplies Online(BSO)
2018/04/30 全球购物
法国设计制造的扫帚和刷子:Andrée Jardin
2018/12/06 全球购物
斯福泰克软件测试面试题
2015/02/16 面试题
英语专业毕业生自荐信
2013/10/28 职场文书
物流专业大学生的自我鉴定
2013/11/13 职场文书
军训自我鉴定范文
2014/02/13 职场文书
我的梦中国梦演讲稿
2014/04/23 职场文书
逃课打麻将检讨书
2014/10/05 职场文书
2015年化验员工作总结
2015/04/10 职场文书
热爱劳动主题班会
2015/08/14 职场文书
2016教师学习教育法心得体会
2016/01/19 职场文书
JS前端可视化canvas动画原理及其推导实现
2022/08/05 Javascript