适合ThinkPHP Cluster的Ueditor SAE移植版

浏览:1671 发布日期:2013/05/15 分类:技术分享 关键字: Ueditor SAE
ueditor是百度开发的一款很强很给力的在线编辑器,开源、可定制,文档还算齐全,注释丰富,还都是中文。最近在我的SAE上折腾,要用到编辑器,就相中ueditor了。由于SAE是禁止本地文件的IO操作的,UEdiotr的附件、图片上传这些功能就不能用了,所以只好把Ueditor移植一下。
移植之前,我们首先要在Storage中创建一个Domain,这里我创建的是upload
我用的是ueditor 1.2.5.1_php_utf8
  1.修改Uploader.class.php
ueditor提供的上传功能都是通过Uploader.class.php(ueditor/php/文件夹下)来实现的,我们需要把92行到97行改一下。
这里的move_uploaded_file显然是不行的,我们需要使用SaeStorage的upload方法。修改后的代码是这样的:// SAE环境修改开始
if ( $this->stateInfo == $this->stateMap[ 0 ] ) {
    if(!defined('SAE_TMP_PATH')){
        // 非SAE环境中
        if ( !move_uploaded_file( $file[ "tmp_name" ] , $this->fullName ) ) {
            $this->stateInfo = $this->getStateInfo( "MOVE" );
        }
    }else{
        // SAE环境中
        $st=new SaeStorage();
        $url=$st->upload('upload',$this->fullName, $file[ "tmp_name" ]);
        if(!$url){
            $this->stateInfo = $this->getStateInfo( "MOVE" );
        }else{
            $this->fullName=$url;
        }
    }
}
// SAE环境修改结束
我这里多做了一个判断,就是通过判断是否存在SAE平台的常量SAE_TMP_PATH来判断当前环境是否SAE,如果是,则执行SAE上的代码,如果不是,则执行普通环境的代码,这样就兼容了SAE和普通环境。要是你使用的是ThinkPHP的话,这样做之后,你的代码就完全可以再两个环境中运行了。有关SaeStorage的说明,请看SAE的文档。后面的也是这样,我就不做过多说明了。
下面我们还要修改getFolder()方法。先把修改后的代码贴上,相信大家一看就明白。private function getFolder()
{
    $pathStr = $this->config[ "savePath" ];
    if ( strrchr( $pathStr , "/" ) != "/" ) {
        $pathStr .= "/";
    }
    $pathStr .= date( "Ymd" );
    // 增加判断SAE环境,以兼容普通环境
    if(!defined('SAE_TMP_PATH')){
        if ( !file_exists( $pathStr ) ) {
            if ( !mkdir( $pathStr , 0777 , true ) ) {
                return false;
            }
        }
    }
    return $pathStr;
}
这里我们屏蔽了新建目录这部,Storage会自动创建。
现在上传试试,是不是文件可以上传成功了,而且Storage中也能看到上传的文件,但编辑器里图片却无法显示,看下源码,发现问题了吧:ueditor给自动加上了修正地址。
2.修改editor_config.js
在SAE中,我们需要把editor_config.js中的7处(分别在38、45、49、54、61、66、72行)修正路径修改为空(”),注意前面的URL,要改成,imagePath:”"而不是,imagePath:URL+”"!至此,编辑器里的图片、附件路径正常了,提交后也能正常显示。
3.修改imageManager.php
经过前面的修改,你还会发现,图片管理还是用不了,我们还要把imageManager.php修改一下。
定位到16行这个if语句:if ( $action == "get" ) {这里是通过遍历的本地目录列表的方式来实现,在SAE上我们需要通过SaeStorage的getList方法来实现。代码很简单,修改后是这样的:if ( $action == "get" ) {
 
    if(!defined('SAE_TMP_PATH')){
        // 普通环境下
        $files = array();
        foreach ( $paths as $path){
            $tmp = getfiles( $path );
            if($tmp){
                $files = array_merge($files,$tmp);
            }
        }
        if ( !count($files) ) return;
        rsort($files,SORT_STRING);
        $str = "";
        foreach ( $files as $file ) {
            $str .= $file . "ue_separate_ue";
        }
        echo $str;
    }else{
        // SAE环境下
        $st=new SaeStorage(); // 实例化
        /*
        *  getList:获取指定domain下的文件名列表
        *  return: 执行成功时返回文件列表数组,否则返回false
        *  参数:存储域,路径前缀,返回条数,起始条数
        */
        $num=0;
        while($ret = $st->getList("upload", NULL, 100, $num )){
            foreach($ret as $file) {
                if ( preg_match( "/\.(gif|jpeg|jpg|png|bmp)$/i" , $file ) )
                echo $st->getUrl('upload',$file). "ue_separate_ue";
                $num++;
            }
        }
    }
}
保存,测试,图片管理可以用了吧!
此外还有在线涂鸦、远程图片抓取等功能也需要移植,我这里没有用到,暂时也就没有搞,但思路和方法就是这样,有兴趣的朋友可以搞一搞。SaeStorage的说明在SAE官网上都有,我还是发个地址给大家http://apidoc.sinaapp.com/sae/SaeStorage.html
我这里基本移植好的ueditor也放出来,和大家分享。我根据我的需要定制过的UEditor1.2.5.1版本,如果需要的功能没有,可以到ueditor官网http://ueditor.baidu.com/下载完整版,然后根据上面说的自己移植。
你可以到我的百度网盘http://pan.baidu.com/share/link?shareid=517037&uk=875907747下载。
最佳答案
评论( 相关
后面还有条评论,点击查看>>