为了在TP中使用Ueditor1.4.3同时兼容SAE,只能重写Storage驱动了

浏览:1649 发布日期:2014/08/03 分类:求助交流 关键字: Ueditor Sae Storage
这段时间一直在研究Ueditor(以下简称UE),想把Ueditor整合进TP3.2,同时又兼容SAE。整合不难,难就难在要兼容sae。作为一名学习者,而非大神,我频繁遇到一些力所不能及的困难,而且困难还在继续。到目前为止,已有进展如下:
首先我目测UE整个后台代码

得出结论,后台要实现的功能有:文件上传、文件列出、远程抓取,并且要返回一个状态信息

整个过程是通过Ajax实现的,非常不好调试:
前端发送一个get请求,后台通过判断get来执行不同的单元。
首先要从后台返回配置信息,比如$_GET['action']的值,input表单名,不同的功能有不同的配置信息。date_default_timezone_set("Asia/chongqing");
error_reporting(E_ERROR);
header("Content-Type: text/html; charset=utf-8");

$CONFIG = json_decode(preg_replace("/\/\*[\s\S]+?\*\//", "", file_get_contents("config.json")), true);
$action = $_GET['action'];

switch ($action) {
    case 'config':
        $result =  json_encode($CONFIG);
        break;
如果配置文件没有加载,程序会停止执行。

下面说说我是如何整合。
一、上传文件。
有人会说,上传文件直接用TP的上传类不就行了吗?是的,我也是这么想的,也是这么做的,因为TP上传类是兼容SAE的。TP的上传是通过驱动实现的,本地用local.class.php,SAE用sae.class.php。哈哈,我之前发过一个求助帖,在研究Upload/Driver/Sae.class.php这个驱动的时候。http://www.thinkphp.cn/topic/21155.html在此再次感谢大神的回复。
UE的上传分为:上传图片,上传视频,上传文件,上传涂鸦。
php的文件上传无非就是获取$_FILES数组,然后用move_uploaded_file()函数处理。可是问题在于“上传涂鸦”,这个过程是不一样的。“上传涂鸦”:前端用Cavas生成图像信息,再进行base64编码,通过post数据到后台。后台对数据base64解码以后,用file_put_content()函数直接写入一个图片格式的文件,从而实现功能上的“上传涂鸦”。这种方式在本地很好解决,可在SAE上呢?我们知道,SAE平台的数据存储有Storage,KVDB,Memcache,Mysql等,而此处这种情况是文件操作,我心想只能基于Storage。有人会说 ,文件读写就用TP的Storage类啊。是的,我也是这么想的。可是在我看了下TP的Storage驱动中sae驱动以后,我发现它并不是基于SAE的Storage,而是基于KVDB和Memcashe。namespace Think\Storage\Driver;
use Think\Storage;
// SAE环境文件写入存储类
class Sae extends Storage{

    /**
     * 架构函数
     * @access public
     */
    private $mc;
    private $kvs        =   array();
    private $htmls      =   array();
    private $contents   =   array();
    public function __construct() {
        if(!function_exists('memcache_init')){
              header('Content-Type:text/html;charset=utf-8');
              exit('请在SAE平台上运行代码。');
        }
        $this->mc       =   @memcache_init();
        if(!$this->mc){
              header('Content-Type:text/html;charset=utf-8');
              exit('您未开通Memcache服务,请在SAE管理平台初始化Memcache服务');
        }
    }

    /**
     * 获得SaeKv对象
     */
    private function getKv(){
        static $kv;
        if(!$kv){
           $kv  =   new \SaeKV();
           if(!$kv->init())
               E('您没有初始化KVDB,请在SAE管理平台初始化KVDB服务');
        }
        return $kv;
    }
文件写入方法为: /**
     * 文件写入
     * @access public
     * @param string $filename  文件名
     * @param string $content  文件内容
     * @return boolean
     */
    public function put($filename,$content,$type=''){
        switch(strtolower($type)){
            case 'f':       
                $kv         =   $this->getKv();
                $this->kvs[$filename] = $content;
                return $kv->set($filename,$content);
            case 'html':    
                $kv         =   $this->getKv();
                $content    =   time().$content;
                $this->htmls[$filename] =   $content;
                return $kv->set($filename,$content);
            default:
                $content    =   time().$content;
                if(!$this->mc->set($filename,$content,MEMCACHE_COMPRESSED,0)){
                    E(L('_STORAGE_WRITE_ERROR_').':'.$filename);
                }else{
                    $this->contents[$filename] = $content;
                    return true;
                }            
        }
    }
所以我的结论就,no way!

二、文件列出。
TP的Storage类中没有这个方法。
三、远程抓取。
还在研究中。。。

综上所述:只能重写Storage驱动。

以上都是我个人的观点,望各位大侠指点赐教!
最佳答案
评论( 相关
后面还有条评论,点击查看>>