• 百度的Ueditor上传到七牛,oss等第三方存储的通用方法(php版)


    用百度的Ueditor上传图片默认保存到本地,在分布式系统中使用非常不方便,一般需要上传到七牛,阿里云的oss上

    需要七牛sdk 6.1.9(支持php5.2,高版本可自行改正)

    Ueditor 1.4.3

    主要原理:百度ueditor上传文件时会创建本地文件,并返回文件路径 $this->fullName,我们需要修改上传类,在上传成功时进行文件的转存,转存成功后把本地的文件删除,该方法可以处理图片,附件等小文件,大文件不建议在ueditor上上传。

    分享地址:http://pan.baidu.com/s/1o8noPdg ;欢迎大家下载和共同研究

    提供修改方式:(oss只要修改配置文件和上传方法就行^_^)

    1.七牛官网下载sdk6.1.9,放在php的文件夹下

    2.在ueditor/php下qiniu_config.php

    <?php
        return array(
            "bucket"=>"***",
            "accessKey"=>"****",
            "secretKey"=>"****"
        );
    ?>

    3.修改php下的config.json,把图片访问的前缀改成相应的远程访问的前缀

    "imageUrlPrefix": "", /* 图片访问路径前缀 */

    4.修改主要的上传文件Uploader.class.php,将upFile方法改成如下方法

    /**
     * 上传到七牛
     * @return mixed
     */
    private function upFile()
    {
        $file = $this->file = $_FILES[$this->fileField];
        if (!$file) {
            $this->stateInfo = $this->getStateInfo("ERROR_FILE_NOT_FOUND");
            return;
        }
        if ($this->file['error']) {
            $this->stateInfo = $this->getStateInfo($file['error']);
            return;
        } else if (!file_exists($file['tmp_name'])) {
            $this->stateInfo = $this->getStateInfo("ERROR_TMP_FILE_NOT_FOUND");
            return;
        } else if (!is_uploaded_file($file['tmp_name'])) {
            $this->stateInfo = $this->getStateInfo("ERROR_TMPFILE");
            return;
        }
    
        $this->oriName = $file['name'];
        $this->fileSize = $file['size'];
        $this->fileType = $this->getFileExt();
        $this->fullName = $this->getFullName();
        $this->filePath = $this->getFilePath();
        $this->fileName = $this->getFileName();
        $dirname = dirname($this->filePath);
    
        //检查文件大小是否超出限制
        if (!$this->checkSize()) {
            $this->stateInfo = $this->getStateInfo("ERROR_SIZE_EXCEED");
            return;
        }
    
        //检查是否不允许的文件格式
        if (!$this->checkType()) {
            $this->stateInfo = $this->getStateInfo("ERROR_TYPE_NOT_ALLOWED");
            return;
        }
    
        //创建目录失败
        if (!file_exists($dirname) && !mkdir($dirname, 0777, true)) {
            $this->stateInfo = $this->getStateInfo("ERROR_CREATE_DIR");
            return;
        } else if (!is_writeable($dirname)) {
            $this->stateInfo = $this->getStateInfo("ERROR_DIR_NOT_WRITEABLE");
            return;
        }
    
        //移动文件
        if (!(move_uploaded_file($file["tmp_name"], $this->filePath) && file_exists($this->filePath))) { //移动失败
            $this->stateInfo = $this->getStateInfo("ERROR_FILE_MOVE");
        } else { //移动成功
    
            //执行到这里,代表已经完成了上传,此时系统会提示上传成功
            //------------------------------------------------  start  ---------------------------------------------------------
            //上传到七牛
            require_once("qiniu/io.php");
            require_once("qiniu/rs.php");
            $config = require_once("qiniu_config.php");
            $bucket = $config['bucket']; //仓库名
            //截取原始文件后缀名
            //$key1 = "Uploads/".time().mt_rand(10,99).$this->getFileExt();
            $accessKey = $config['accessKey'];
            $secretKey = $config['secretKey'];
    
            Qiniu_SetKeys($accessKey, $secretKey);
            $putPolicy = new Qiniu_RS_PutPolicy($bucket);
            $upToken = $putPolicy->Token(null);
            $putExtra = new Qiniu_PutExtra();
            $putExtra->Crc32 = 1;
            //$file[ "tmp_name" ] ueditor上传的临时文件路径
            list($ret, $err) = Qiniu_PutFile($upToken,$this->fullName,$_SERVER['DOCUMENT_ROOT']."/".$this->fullName, $putExtra);
            //成功了,删除本地文件
            if($ret)
            {
                @unlink($_SERVER['DOCUMENT_ROOT']."/".$this->fullName);
                //file_put_contents("./log/log.txt","
    time:".time()."  ".json_encode($ret)."
    ",FILE_APPEND);
            }
            if($err)
            {
                if(!is_dir("./log")){
                    if(!mkdir("log",0755,true)){
                        die("当前目录没有写权限");
                    }
                }
                file_put_contents("./log/log.txt","
    time:".time()."  ".json_encode($_SERVER['DOCUMENT_ROOT']."/".$this->fullName)."
    ",FILE_APPEND);
                $this->stateInfo = $this->getStateInfo("QINIU_ERR");
            }else{
                $this->stateInfo = $this->stateMap[0];
            }
            //------------------------------------------------- end   ---------------------------------------------------------
        }
    }

    5.修改upBase64方法(如果不用截屏和涂鸦可以不改)

    /**
     * 处理base64编码的图片上传
     * @return mixed
     */
    private function upBase64()
    {
        $base64Data = $_POST[$this->fileField];
        $img = base64_decode($base64Data);
    
        $this->oriName = $this->config['oriName'];
        $this->fileSize = strlen($img);
        $this->fileType = $this->getFileExt();
        $this->fullName = $this->getFullName();
        $this->filePath = $this->getFilePath();
        $this->fileName = $this->getFileName();
        $dirname = dirname($this->filePath);
    
        //检查文件大小是否超出限制
        if (!$this->checkSize()) {
            $this->stateInfo = $this->getStateInfo("ERROR_SIZE_EXCEED");
            return;
        }
    
        //创建目录失败
        if (!file_exists($dirname) && !mkdir($dirname, 0777, true)) {
            $this->stateInfo = $this->getStateInfo("ERROR_CREATE_DIR");
            return;
        } else if (!is_writeable($dirname)) {
            $this->stateInfo = $this->getStateInfo("ERROR_DIR_NOT_WRITEABLE");
            return;
        }
    
        //移动文件
        if (!(file_put_contents($this->filePath, $img) && file_exists($this->filePath))) { //移动失败
            $this->stateInfo = $this->getStateInfo("ERROR_WRITE_CONTENT");
        } else { //移动成功
    
            require_once("qiniu/io.php");
            require_once("qiniu/rs.php");
    
            $config = require_once("qiniu_config.php");
            $bucket = $config['bucket']; //仓库名
            //截取原始文件后缀名
            //$key1 = "Uploads/".time().mt_rand(10,99).$this->getFileExt();
            $accessKey = $config['accessKey'];
            $secretKey = $config['secretKey'];
    
            Qiniu_SetKeys($accessKey, $secretKey);
            $putPolicy = new Qiniu_RS_PutPolicy($bucket);
            $upToken = $putPolicy->Token(null);
            $putExtra = new Qiniu_PutExtra();
            $putExtra->Crc32 = 1;
            //$file[ "tmp_name" ] ueditor上传的临时文件路径
            list($ret, $err) = Qiniu_PutFile($upToken,$this->fullName,$_SERVER['DOCUMENT_ROOT']."/".$this->fullName, $putExtra);
            if($ret)
            {
                //删临时文件
                @unlink($_SERVER['DOCUMENT_ROOT']."/".$this->fullName);
              //  file_put_contents("./log/log.txt","
    time:".time()."  ".json_encode($ret)."
    ",FILE_APPEND);
            }
    
            if($err)
            {
                file_put_contents("./log/log.txt","
    time:".time()."  ERR:".json_encode($err)."    ".json_encode($_SERVER['DOCUMENT_ROOT']."/".$this->fullName)."
    ",FILE_APPEND);
               // $this->stateInfo = $this->getStateInfo("QINIU_ERR");
            }
    
            $this->stateInfo = $this->stateMap[0];
        }
    
    }

    6.修改重命名方法,主要是随机数那里抹去两个零就可以了

    /**
         * 重命名文件
         * @return string
         */
        private function getFullName()
        {
            //替换日期事件
            $t = time();
            $d = explode('-', date("Y-y-m-d-H-i-s"));
            $format = $this->config["pathFormat"];
            $format = str_replace("{yyyy}", $d[0], $format);
            $format = str_replace("{yy}", $d[1], $format);
            $format = str_replace("{mm}", $d[2], $format);
            $format = str_replace("{dd}", $d[3], $format);
            $format = str_replace("{hh}", $d[4], $format);
            $format = str_replace("{ii}", $d[5], $format);
            $format = str_replace("{ss}", $d[6], $format);
            $format = str_replace("{time}", $t, $format);
    
            //过滤文件名的非法自负,并替换文件名
            $oriName = substr($this->oriName, 0, strrpos($this->oriName, '.'));
            $oriName = preg_replace("/[|?"<>/*\\]+/", '', $oriName);
            $format = str_replace("{filename}", $oriName, $format);
    
            //替换随机字符串
            $randNum = rand(1, 100000000) . rand(1, 100000000);
            if (preg_match("/{rand:([d]*)}/i", $format, $matches)) {
                $format = preg_replace("/{rand:[d]*}/i", substr($randNum, 0, $matches[1]), $format);
            }
    
            $ext = $this->getFileExt();
            return $format . $ext;
        }

    转载自: https://my.oschina.net/u/2528821/blog/817896

  • 相关阅读:
    洛谷 P1260 工程规划(差分约束)
    洛谷 P3660 [USACO17FEB]Why Did the Cow Cross the Road III G(树状数组)
    [模板]单调队列
    [模板]LIS(最长上升子序列)
    洛谷 P2899 [USACO08JAN]手机网络Cell Phone Network(树形动规)
    如何求数字n的因数个数及因数和
    [模板]tarjan缩点+拓扑排序
    itext生成pdf(附带页眉,页脚,页码)
    工作总结03
    工作总结02(海报上传模块)
  • 原文地址:https://www.cnblogs.com/lyjfight/p/12956815.html
Copyright © 2020-2023  润新知