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中在数据库中保存Checkbox数据(2)
Oct 09 PHP
如何跨站抓取别的站点的页面的补充
Oct 09 PHP
PHP 文件上传进度条的两种实现方法的代码
Nov 25 PHP
攻克CakePHP系列一 连接MySQL数据库
Oct 22 PHP
Windows 下的 PHP-PEAR 安装方法
Nov 20 PHP
PHP数据流应用的一个简单实例
Sep 14 PHP
PHP中使用虚代理实现延迟加载技术
Nov 05 PHP
PHP file_get_contents函数读取远程数据超时的解决方法
May 13 PHP
5款适合PHP使用的HTML编辑器推荐
Jul 03 PHP
PHP面向对象程序设计之类与反射API详解
Dec 02 PHP
PHP合并数组函数array_merge用法分析
Feb 17 PHP
php简单读取.vcf格式文件的方法示例
Sep 02 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者的疑难问答(2)
2006/10/09 PHP
apache配置虚拟主机的方法详解
2013/06/17 PHP
使用Smarty 获取当前日期时间和格式化日期时间的方法详解
2013/06/18 PHP
php实现插入数组但不影响原有顺序的方法
2015/03/27 PHP
简要剖析PHP的Yii框架的组件化机制的基本知识
2016/03/17 PHP
php文件上传后端处理小技巧
2016/05/22 PHP
50个优秀经典PHP算法大集合 附源码
2020/08/26 PHP
PHP队列场景以及实现代码实例详解
2021/02/26 PHP
HR vs CL BO3 第一场 2.13
2021/03/10 DOTA
JS.getTextContent(element,preformatted)使用介绍
2013/09/21 Javascript
怎么选择Javascript框架(Javascript Framework)
2013/11/22 Javascript
js控制鼠标事件移动及移出效果显示
2014/10/19 Javascript
Bootstrap 组件之按钮(二)
2016/05/11 Javascript
jQuery制作input提示内容(兼容IE8以上)
2017/07/05 jQuery
vue页面切换过渡transition效果
2018/10/08 Javascript
vue调用语音播放的方法
2019/09/27 Javascript
细述Javascript的加法运算符的具体使用
2019/10/18 Javascript
Vue 使用beforeEach实现登录状态检查功能
2019/10/31 Javascript
在JavaScript中实现链式调用的实现
2019/12/24 Javascript
JavaScript 变量,数据类型基础实例详解【变量、字符串、数组、对象等】
2020/01/04 Javascript
JS异步宏队列微队列原理详解
2020/09/09 Javascript
JavaScript实现网页留言板功能
2020/11/23 Javascript
[02:41]《西雅图我们来了》2015国际邀请赛出征全记录
2015/07/23 DOTA
Python多线程编程(一):threading模块综述
2015/04/05 Python
CSS3 2D模拟实现摩天轮旋转效果
2016/11/16 HTML / CSS
html5通过postMessage进行跨域通信的方法
2017/12/04 HTML / CSS
Casetify官网:自制专属手机壳、iPad护壳和Apple Watch手表带
2018/05/09 全球购物
生日礼品店创业计划书范文
2014/03/21 职场文书
党员领导干部承诺书
2014/05/28 职场文书
商务司机岗位职责
2015/04/10 职场文书
拾金不昧通报表扬范文
2015/05/05 职场文书
2019最新版劳务派遣管理制度
2019/08/16 职场文书
教你如何使用Python开发一个钉钉群应答机器人
2021/06/21 Python
SQL Server代理:理解SQL代理错误日志处理方法
2021/06/30 SQL Server
Python安装使用Scrapy框架
2022/04/12 Python
windows server2008 开启端口的实现方法
2022/06/25 Servers