织梦站群管理系统已实现编辑内容中上传资源同步到分站的功能
开发框架使用的是ThinkCMF开源系统,文章编辑器也是集成好的,使用的百度UEditor编辑器,那么使用在此织梦站群管理系统中,还需要做一些小的修改。
第一步,修改统一上传接口
0 |
window.UEDITOR_SERVER_URL = "{:cmf_url('AdminUeditor/uploadToSub', array('sgid'=>$sgid))}"; // 服务器请求接口路径 |
第二步,新建控制器,以实现同步织梦站群管理系统《单发》文章编辑资源的同步分站保存的功能
复制thinkcmf的控制器\vendor\thinkcmf\cmf-app\src\user\controller\UeditorController.php
到自己的应用下,改名为AdminUeditorController.php,并进行逻辑上的修改。
为防止织梦站群管理系统中可能存在大量无用资源的情况,那么在中转资源到分站后,要删除站群系统中当前上传的资源。
需要注意的:
1、修改UEditor编辑器的配置:在最初没想复制创建新控制器,只是想仿着返回数据的格式来返回数据,之前也没有注意到在加载UEditor时,thinkcmf是需要获取后台配置的,所以一直是出错,编辑器初始化会出错。在thinkcmf中的百度UEditor编辑器初始化是有一个/user/Ueditor/upload?action=config
的这个请求的,来获取框架对上传的配置信息的,所以复制修改他们的控制器后(不想直接修改UEditor的插件逻辑,个人感觉也是最好不要修改UEditor的原有逻辑),所有问题基本上就全部解决了。
2、提交发布后在后台处理body字段中的绝对链接为相对链接:同步到分站的资源(主要是图片)后,在织梦站群管理系统中的编辑器中获取返回链接,返回得是相对地址,那么显示在编辑器中,就需要拼接成为绝对链接,即带有分站域名的链接。但是考虑如果分站有换域名的情况发生的话,这些图片资源就不能正常浏览了,所以在站群系统中提交发布时需要对body内容中的图片资源的协议头和域名进行清除处理。另有一点就是分站或者是分站的主机不要开启防盗用资源的功能,如果有,则把织梦站群管理系统的域名加在白名单中,否则站群系统中的文章编辑器将不能显示此前同步的资源,也有可能会造成提交发布后,在分站不能显示出此前同步的资源的可能。
3、向分站发送(图片)资源:我测试在thinkcmf框架下php版本>=5.6可用(PHP v5.5时框架就会出错了),我的实际项目的环境的PHP版本是7.1,同步过来的图片资源,是通过PHP的CURL方法实现的,封装的CURL类的部分源码,以下源码为CURL实现POST发送文件的重要部分:
0 1 2 3 4 5 6 7 8 9 |
if (class_exists('\CURLFile')) { curl_setopt($curl, CURLOPT_SAFE_UPLOAD, true); $mimeType = isset($_FILES['file']['type']) ? $_FILES['file']['type'] : null; $postData[$postFile] = new \CURLFile(realpath($postData[$postFile]), $mimeType);//>=5.5 } else { if (defined('CURLOPT_SAFE_UPLOAD')) { curl_setopt($curl, CURLOPT_SAFE_UPLOAD, false); } $postData[$postFile] = '@' . realpath($postData[$postFile]);//<=5.5 } |
$mimeType 是资源类型,项目实际传入值为image
$postFile 是接收图片资源的字段名称;
$postData 准备发送出去的全部键值对数据;
$postData[$postFile] 是文件在站群系统项目中的绝对路径;
接收资源时,因为传送是采用二进制流的形式的,所以的值是application/octetstream
4、分站接收资源:使用AdminUpload()改造后的函数。
0 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 |
// 处理上传 根据AdminUpload()函数改写的 function MrdedeAdminUpload($uploadname, $ftype='image', $rnddd=0, $watermark=TRUE, $filetype='' ) { global $dsql, $cuserLogin, $cfg_addon_savetype, $cfg_dir_purview; global $cfg_basedir, $cfg_image_dir, $cfg_soft_dir, $cfg_other_medias; global $cfg_imgtype, $cfg_softtype, $cfg_mediatype; if($watermark) include_once(DEDEINC.'/image.func.php'); $file_tmp = isset($GLOBALS[$uploadname]) ? $GLOBALS[$uploadname] : ''; if($file_tmp=='' || !is_uploaded_file($file_tmp) ) { return -1; } $file_tmp = $GLOBALS[$uploadname]; // $file_size = filesize($file_tmp); $file_type = $filetype=='' ? strtolower(trim($GLOBALS[$uploadname.'_type'])) : $filetype; $file_name = isset($GLOBALS[$uploadname.'_name']) ? $GLOBALS[$uploadname.'_name'] : ''; $file_snames = explode('.', $file_name); $file_sname = strtolower(trim($file_snames[count($file_snames)-1])); if($ftype=='image' || $ftype=='imagelit') { $filetype = '1'; $sparr = Array('image/pjpeg', 'image/jpeg', 'image/gif', 'image/png', 'image/xpng', 'image/wbmp', 'application/octetstream'); if(!in_array($file_type, $sparr)) return 0; if($file_sname=='') { if($file_type=='image/gif') $file_sname = 'jpg'; else if($file_type=='image/png' || $file_type=='image/xpng') $file_sname = 'png'; else if($file_type=='image/wbmp') $file_sname = 'bmp'; else $file_sname = 'jpg'; } $filedir = $cfg_image_dir.'/'.MyDate($cfg_addon_savetype, time()); } else if($ftype=='media') { $filetype = '3'; if( !preg_match('/'.$cfg_mediatype.'/', $file_sname) ) return 0; $filedir = $cfg_other_medias.'/'.MyDate($cfg_addon_savetype, time()); } else { $filetype = '4'; $cfg_softtype .= '|'.$cfg_mediatype.'|'.$cfg_imgtype; $cfg_softtype = str_replace('||', '|', $cfg_softtype); if( !preg_match('/'.$cfg_softtype.'/', $file_sname) ) return 0; $filedir = $cfg_soft_dir.'/'.MyDate($cfg_addon_savetype, time()); } if(!is_dir(DEDEROOT.$filedir)) { MkdirAll($cfg_basedir.$filedir, $cfg_dir_purview); CloseFtp(); } $filename = $cuserLogin->getUserID().'-'.dd2char(MyDate('ymdHis', time())).$rnddd; if($ftype=='imagelit') $filename .= '-L'; if( file_exists($cfg_basedir.$filedir.'/'.$filename.'.'.$file_sname) ) { for($i=50; $i <= 5000; $i++) { if( !file_exists($cfg_basedir.$filedir.'/'.$filename.'-'.$i.'.'.$file_sname) ) { $filename = $filename.'-'.$i; break; } } } $fileurl = $filedir.'/'.$filename.'.'.$file_sname; $rs = move_uploaded_file($file_tmp, $cfg_basedir.$fileurl); if(!$rs) return -2; if($ftype=='image' && $watermark) { WaterImg($cfg_basedir.$fileurl, 'up'); } //保存信息到数据库 $title = $filename.'.'.$file_sname; $inquery = "INSERT INTO `#@__uploads`(title,url,mediatype,width,height,playtime,filesize,uptime,mid) VALUES ('$title','$fileurl','$filetype','0','0','0','".filesize($cfg_basedir.$fileurl)."','".time()."','".$cuserLogin->getUserID()."'); "; $dsql->ExecuteNoneQuery($inquery); $fid = $dsql->GetLastID(); AddMyAddon($fid, $fileurl); return $fileurl; } |
其实只是在函数内的$sparr的数组中增加了application/octetstream,默认就把传过来的图片资源保存为jpg格式的图片了。