最近由于工作需要,一次性需要把所有的编辑器改进成CKEditor,不过这玩意没有上传功能,只好找到它的姐妹产品CKFinder。网上一查,才知道这两东西合伙才有希望完成上传等诸多功能。
由于之前都用FCKeditor,突然使用CKEditor蛮不适应,不过FCK由于有漏洞,也不敢用了,才知道原来FCK是CK的前身。 几经抓狂,花了半天时间终于搞定了。
总结了以下心得:
1、/ckeditor/config.js, 配置文件,如果不想写太多,可以直接写好默认配置(语言,菜单栏,宽度),有需要可以百度config配置。
打开/ckfinder/config.php, 首先设置第一个函数CheckAuthentication(),这个函数需要按照自己的规则写,只要return true的情况才能允许上传文件到服务器的,当然不建议直接写return true,这将导致安全问题。可以采用session来处理比较方便。
打开ckfinder\core\connector\php\php5\CommandHandler\FileUpload.php文件,在文件最后加个生成文件名函数
如果您的网站上传文件比较多,文件都在一个目录下的话,对文件性能可能不是很思想,这时我们按/upload/yyyy/mm/格式生成目录。打开ckfinder\config.php文件,找到$config['ResourceType'][],大约在189行,在 'url' => $baseUrl . 'files' 和 'directory' => $baseDir . 'files' 都加上 . '/' . date("Y") . '/' . date("m"),其它 Images,Flash项也是如此。这里的 url 表示上传后返回到输入框的地址,directory表示上传文件的目录。
7、 最后就是使用ckfinder
另一种js或html页面的修改
两者配合用起来还是挺不错的,更重要的原因是安全性高了很多。
有两个原因:
1:上传目录没有写入权限
2:因为出于安全考虑ckfinder/config.php文件中的CheckAuthentication()函数默认返回值是false, 需要手动修改验证条件, 不建议直接返回true
由于ckfinder不是免费的,所以默认情况下会在上传页面中有红色的广告提示,虽然不影响使用,但总是觉得不爽。
破解方法:
1.x版的破解方法:打开core/js下的两个ckfinder_ie.js和ckfinder_gecko.js文件.查找字符串"en.call(window,qo);"将其注释即可;
2.0版的把广告语写在了ckfinder.js中,类似
x50\154\145\x61\x73\145\040\x76\151\x73\151\164\040\164\150\x65\x20\x3c\141\x20\150\x72\145\x66\075\047\x68\x74\x74\x70\x3a\057\x2f\x63\153\x66\151\156\144\x65\162\x2e\x63\157\155\x27\x20\164\141\162\147\x65\164\x3d\x27\137\142\154\x61\156\x6b\047\076\x43\113\x46\x69\x6e\144\x65\x72\x20\x77\145\x62\040\163\x69\164\x65\x3c\057\x61\x3e\x20\164\x6f\x20\157\x62\164\x61\151\x6e\040\x61\x20\166\141\x6c\x69\144\040\x6c\x69\x63\145\x6e\163\x65\x2e
由于之前都用FCKeditor,突然使用CKEditor蛮不适应,不过FCK由于有漏洞,也不敢用了,才知道原来FCK是CK的前身。 几经抓狂,花了半天时间终于搞定了。
总结了以下心得:
1、/ckeditor/config.js, 配置文件,如果不想写太多,可以直接写好默认配置(语言,菜单栏,宽度),有需要可以百度config配置。
config.language = 'en';
config.skin = 'v2';
config.uiColor = '#AADC6E';
config.toolbar = 'Basic';
....
2、官方的demo大多都喜欢用js配置editor区域,习惯写php的我就嫌麻烦,只好看内置的php类。
require_once ROOTPATH . "ckeditor/ckeditor.php";
$CKEditor = new CKEditor();
$CKEditor->returnOutput = true; //设置输出可用变量的情况
$CKEditor->basePath = '/ckeditor/';//设置路径
$contentarea = $CKEditor->editor("content", $rs['contents']); //生成一个以name为content的textarea
echo $contentarea;
3、需要上传了 ,只好加入ckfinder。把ckfinder和ckeditor放在同级目录下。
打开/ckfinder/config.php, 首先设置第一个函数CheckAuthentication(),这个函数需要按照自己的规则写,只要return true的情况才能允许上传文件到服务器的,当然不建议直接写return true,这将导致安全问题。可以采用session来处理比较方便。
session_start();
function CheckAuthentication(){
if(isset($_SESSION['UseEidtor']))
return true;
else
return false;
}
4、上传文件位置:也在/ckfinder/config.php, 找到$baseUrl,之前一直想自己写一个方法用来定位路径,实在不好办,后来只好用sesssion,如果一个网站中,有需要上传到不同的位置,正好可以利用session定位。
if (isset($_SESSION['UseEidtor'])) {
switch ($_SESSION['UseEidtor']) {
case 'Addr1':
$baseUrl = '/addr1/uploadfile/';
case 'Addr2':
$baseUrl = '/addr2/upfiles/';
}
} else {
$baseUrl = '/upfiles/';
}
5、对于上传文件名,ckfinder会按照原有的名字命名,中文的情况下可能会乱码,所以建议使用日期重命名。打开/ckfinder/core/connector/php/php5/CommandHandler/FileUpload.php 找到
$sUnsafeFileName =CKFinder_Connector_Utils_FileSystem::convertToFilesystemEncoding(CKFinder_Connector_Utils_Misc::mbBasename($uploadedFile['name']));
后面加上
$sExtension = CKFinder_Connector_Utils_FileSystem::getExtension($sUnsafeFileName);
$sUnsafeFileName=date('YmdHis').'.'.$sExtension;
或者
打开ckfinder\core\connector\php\php5\CommandHandler\FileUpload.php文件,在文件最后加个生成文件名函数
function mySetFileName() {
$gettime = explode(' ', microtime());
$string = 'abcdefghijklmnopgrstuvwxyz0123456789';
$rand = '';
for ($x = 0; $x < 5; $x++) {
$rand .= substr($string, mt_rand(0, strlen($string) - 1), 1);
}
return date("ymdHis") . substr($gettime[0], 2, 6) . $rand;
}
$sExtension = CKFinder_Connector_Utils_FileSystem::getExtension($sUnsafeFileName);
$sUnsafeFileName = mySetFileName() . '.' . $sExtension;
6、设置按日期生成上传子目录
如果您的网站上传文件比较多,文件都在一个目录下的话,对文件性能可能不是很思想,这时我们按/upload/yyyy/mm/格式生成目录。打开ckfinder\config.php文件,找到$config['ResourceType'][],大约在189行,在 'url' => $baseUrl . 'files' 和 'directory' => $baseDir . 'files' 都加上 . '/' . date("Y") . '/' . date("m"),其它 Images,Flash项也是如此。这里的 url 表示上传后返回到输入框的地址,directory表示上传文件的目录。
7、 最后就是使用ckfinder
require_once ROOTPATH . "ckeditor/ckeditor.php";
require_once ROOTPATH . 'ckfinder/ckfinder.php' ;
$CKEditor = new CKEditor();
$CKEditor->returnOutput = true;
$CKEditor->basePath = '/ckeditor/';
CKFinder::SetupCKEditor($CKEditor, '/ckfinder/') ;//注意这里是相对路径,相对于根目录,不能用绝对路径
$contentarea = $CKEditor->editor("content", $rs['contents']);
echo $contentarea;
另一种js或html页面的修改
<script type="text/javascript">
CKEDITOR.replace( 'editor1',
{
filebrowserBrowseUrl : 'ckeditor/ckfinder/ckfinder.html',
filebrowserImageBrowseUrl : 'ckeditor/ckfinder/ckfinder.html?Type=Images',
filebrowserFlashBrowseUrl : 'ckeditor/ckfinder/ckfinder.html?Type=Flash',
filebrowserUploadUrl : 'ckeditor/ckfinder/core/connector/php/connector.php?command=QuickUpload&type=Files',
filebrowserImageUploadUrl : 'ckeditor/ckfinder/core/connector/php/connector.php?command=QuickUpload&type=Images',
filebrowserFlashUploadUrl : 'ckeditor/ckfinder/core/connector/php/connector.php?command=QuickUpload&type=Flash'
});
</script>
两者配合用起来还是挺不错的,更重要的原因是安全性高了很多。
补充:
若整合后会出现“ 因为安全原因,文件不可浏览. 请联系系统管理员并检查CKFinder配置文件”错误有两个原因:
1:上传目录没有写入权限
2:因为出于安全考虑ckfinder/config.php文件中的CheckAuthentication()函数默认返回值是false, 需要手动修改验证条件, 不建议直接返回true
由于ckfinder不是免费的,所以默认情况下会在上传页面中有红色的广告提示,虽然不影响使用,但总是觉得不爽。
破解方法:
1.x版的破解方法:打开core/js下的两个ckfinder_ie.js和ckfinder_gecko.js文件.查找字符串"en.call(window,qo);"将其注释即可;
2.0版的把广告语写在了ckfinder.js中,类似
x50\154\145\x61\x73\145\040\x76\151\x73\151\164\040\164\150\x65\x20\x3c\141\x20\150\x72\145\x66\075\047\x68\x74\x74\x70\x3a\057\x2f\x63\153\x66\151\156\144\x65\162\x2e\x63\157\155\x27\x20\164\141\162\147\x65\164\x3d\x27\137\142\154\x61\156\x6b\047\076\x43\113\x46\x69\x6e\144\x65\x72\x20\x77\145\x62\040\163\x69\164\x65\x3c\057\x61\x3e\x20\164\x6f\x20\157\x62\164\x61\151\x6e\040\x61\x20\166\141\x6c\x69\144\040\x6c\x69\x63\145\x6e\163\x65\x2e
这样恶心的代码,暂时没有找到破解方法。