在OneThink的后台(以下称为OT),默认的文件上传和图片上传方式是上传至网站根目录下的/Upload/目录下。ThinkPHP支持七牛云,Bcs云上传方式,通过参考手册可以把OT后台配置为对应的上传方式。
之前也写过一篇ThinkPHP中引入阿里云OSS文件上传的博客,但是并不适用与OneThink的后台文件上传。因为OneThink的后台文件上传方式,是通过配置模型的字段来完成的,比如我需要一个blog表,我就需要新建一个名字为blog的模型,为其添加各种所需的字段,其中包含一种类型为“文件上传”或者“图片上传”的类型,这样我们就不需要复写模板的表单页,来完成各种字段该有的功能。
下面介绍下,在OT后台配置阿里云OSS文件上传的方式(支持编辑器内文件和图片上传):

1、下载配置所需的OSS driver等文件:

下载链接为:http://pan.baidu.com/s/1c2OmaWS 密码: fau7

把下载好的目录里的Aliyun.class.php和Aliyun目录,放在/ThinkPHP/Library/Think/Upload/Driver/目录下。
在Aliyun.class.php里,可以看到代码里引入了一些常量来表示。

2、配置文件修改

/Application/Common/common.php新增代码(也可以在/Application/Common/Conf/config.php配置):
这些常量就是之前Aliyun.class.php里的常量

define('OSS', ''); //oss外网域名
define('OSS_AccessKeyId', '');  //OSS用户
define('OSS_AccessKeySecret', '');  //OSS密码
define('OSS_Bucket', '');  //空间名称
define('OSS_Endpoint', ''); //OSS节点的URL
define('OSS_timeout', 600); //超时时间

/Application/Admin/Conf/config.php关于文件和图片上传配置改为如下配置:

/* 文件上传相关配置 */
'DOWNLOAD_UPLOAD' => array(
    'mimes'    => '', //允许上传的文件MiMe类型
    'maxSize'  => 500*1024*1024, //上传的文件大小限制 (0-不做限制)
    'exts'     => 'jpg,gif,png,jpeg,zip,rar,tar,gz,7z,doc,docx,txt,xml,mp4,avi,rmvb,flv,mkv,wmv,pdf', //允许上传的文件后缀
    'autoSub'  => true, //自动子目录保存文件
    'subName'  => array('date', 'Y-m-d'), //子目录创建方式,[0]-函数名,[1]-参数,多个参数使用数组
    'rootPath' => OSS, //保存根路径
    'savePath' => '', //保存路径
    'saveName' => array('uniqid', ''), //上传文件命名规则,[0]-函数名,[1]-参数,多个参数使用数组
    'saveExt'  => '', //文件保存后缀,空则使用原后缀
    'replace'  => false, //存在同名是否覆盖
    'hash'     => true, //是否生成hash编码
    'callback' => false, //检测文件是否存在回调函数,如果存在返回文件信息数组
),

 //下载模型上传配置(文件上传类配置)
/* 图片上传相关配置 */
'PICTURE_UPLOAD' => array(
    'mimes'    => '', //允许上传的文件MiMe类型
    'maxSize'  => 50*1024*1024, //上传的文件大小限制 (0-不做限制)
    'exts'     => 'jpg,gif,png,jpeg,gif', //允许上传的文件后缀
    'autoSub'  => true, //自动子目录保存文件
    'subName'  => array('date', 'Y-m-d'), //子目录创建方式,[0]-函数名,[1]-参数,多个参数使用数组
    'rootPath' => 'h'.OSS, //保存根路径为阿里云OSS,加h是为了补全http的h
    'savePath' => '', //保存路径
    'saveName' => array('uniqid', ''), //上传文件命名规则,[0]-函数名,[1]-参数,多个参数使用数组
    'saveExt'  => '', //文件保存后缀,空则使用原后缀
    'replace'  => false, //存在同名是否覆盖
    'hash'     => true, //是否生成hash编码
    'callback' => false, //检测文件是否存在回调函数,如果存在返回文件信息数组
), 

//图片上传相关配置(文件上传类配置)
'DOWNLOAD_UPLOAD_DRIVER'=>'aliyun',
'PICTURE_UPLOAD_DRIVER'=>'aliyun',//OSS图片上传方法之二,走的是TP的上传驱动
'FILE_UPLOAD_TYPE'=>'aliyun', //OSS文件上传,走的是TP的上传驱动
//本地上传文件驱动配置
// 'UPLOAD_LOCAL_CONFIG'=>array(),
// 'UPLOAD_BCS_CONFIG'=>array(
//     'AccessKey'=>'',
//     'SecretKey'=>'',
//     'bucket'=>'',
//     'rename'=>false
// ),
// 'UPLOAD_QINIU_CONFIG'=>array(
//     'accessKey'=>'__ODsglZwwjRJNZHAu7vtcEf-zgIxdQAY-QqVrZD',
//     'secrectKey'=>'Z9-RahGtXhKeTUYy9WCnLbQ98ZuZ_paiaoBjByKv',
//     'bucket'=>'onethinktest',
//     'domain'=>'onethinktest.u.qiniudn.com',
//     'timeout'=>3600,
// ),
'UPLOAD_ALIYUN_CONFIG'=>array(
    'AccessKeyId' => OSS_AccessKeyId, //OSS用户
    'AccessKeySecret' => OSS_AccessKeySecret, //OSS密码
    'domain'        => OSS,   //OSS空间路径
    'Bucket'   => OSS_Bucket, //空间名称
    'Endpoint'  => OSS_Endpoint,
    'timeout'=> OSS_timeout,
),
'UPLOAD_TYPE_CONFIG'=>array(
    'AccessKeyId' => OSS_AccessKeyId, //OSS用户
    'AccessKeySecret' => OSS_AccessKeySecret, //OSS密码
    'domain'        => OSS,   //OSS空间路径
    'Bucket'   => OSS_Bucket, //空间名称
    'Endpoint'  => OSS_Endpoint,
    'timeout'=> OSS_timeout,
),
/* 编辑器图片上传相关配置 */
'EDITOR_UPLOAD' => array(
    'mimes'    => '', //允许上传的文件MiMe类型
    'maxSize'  => 50*1024*1024, //上传的文件大小限制 (0-不做限制)
    'exts'     => 'jpg,gif,png,jpeg,gif', //允许上传的文件后缀
    'autoSub'  => true, //自动子目录保存文件
    'subName'  => array('date', 'Y-m-d'), //子目录创建方式,[0]-函数名,[1]-参数,多个参数使用数组
    'rootPath' => OSS, //保存根路径
    'savePath' => '', //保存路径
    'saveName' => array('uniqid', ''), //上传文件命名规则,[0]-函数名,[1]-参数,多个参数使用数组
    'saveExt'  => '', //文件保存后缀,空则使用原后缀
    'replace'  => false, //存在同名是否覆盖
    'hash'     => true, //是否生成hash编码
    'callback' => false, //检测文件是否存在回调函数,如果存在返回文件信息数组
),
3、解决图片同一张只能上传一次的问题:

/Application/Admin/Model/下注释掉FileModel和PictureModel的removeTrash方法和调用removeTrash方法的代码:

// $setting['removeTrash'] = array($this, 'removeTrash');
// /**  
//  * 清除数据库存在但本地不存在的数据  
//  * @param $data  
//  */  
// public function removeTrash($data){  
//  $this->where(array('id'=>$data['id'],))->delete();  

// }

4、解决图片上传成功后,模板不显示图片的问题

编辑/Application/Admin/Controller/FileController.class.php,找到这一行:

$return['data'] = think_encrypt(json_encode($info['download']));  

将其改为:
$return['data'] = $info['download']['id']; 
解释下:因为在完成上传的时候,在前端的edit模板里,取的是data.id,但是在后台的upload方法里,返回的是加密过的一串长字符,这是由于upload方法的返回数据不是id造成的(该id是onethink_file表的id)
5、编辑/Application/Addons/EditorForAdmin/Controller/UploadController.class.php
这一步是为了让后台的编辑器支持文件上传和图片上传
可以通过下载第一步,给出的UploadController.class.php,也可以直接复制下面的代码:


// +----------------------------------------------------------------------
namespace AddonsEditorForAdminController;
use HomeControllerAddonsController;
use ThinkUpload;
class UploadController extends AddonsController {
    public $uploader = null;
    /* 上传图片 */
    public function upload() {
        /* 上传配置 */
        $setting = C ( 'EDITOR_UPLOAD' );
        $setting ['callback'] = array (
                $this,
                'isFile'
        );
        /* 调用文件上传组件上传文件 */
         $pic_driver = C('PICTURE_UPLOAD_DRIVER');
        $this->uploader = new Upload($setting, C('PICTURE_UPLOAD_DRIVER'),C("UPLOAD_{$pic_driver}_CONFIG"));
        //$this->uploader = new Upload ( $setting, 'Local' );
        $info = $this->uploader->upload ( $_FILES );
        if ($info) {
            $dao = D ( 'Picture', 'Home' );
            foreach ( $info as &$file ) {
                $file ['rootpath'] = __ROOT__ . ltrim ( $setting ['rootPath'], "." );
                /* 已经存在文件记录 */
                if (isset ( $file ['id'] ) && is_numeric ( $file ['id'] )) {
                    continue;
                }
                /* 记录文件信息 */
                $file ['path'] = substr ( $setting ['rootPath'], 1 ) . $file ['savepath'] . $file ['savename'];
                $file ['status'] = 1;
                $file ['create_time'] = NOW_TIME;
                if ($dao->create ( $file ) && ($id = $dao->add ())) {
                    $file ['id'] = $id;
                }
            }
        }
        return $info;
    }
    // keditor编辑器上传图片处理
    public function ke_upimg() {
        /* 返回标准数据 */
        $return = array (
                'error' => 0,
                'info' => '上传成功',
                'data' => ''
        );
        $info = $this->upload ();
        $img = $info ['imgFile'] ['rootpath'] . $info ['imgFile'] ['savepath'] . $info ['imgFile'] ['savename'];
        /* 记录附件信息 */
        if ($img) {
            $return ['id'] = $info ['imgFile'] ['id'];
            $return ['url'] = $img;
            unset ( $return ['info'], $return ['data'] );
        } else {
            $return ['error'] = 1;
            $return ['message'] = $this->uploader->getError ();
        }
         
        /* 返回JSON数据 */
        exit ( json_encode ( $return ) );
    }
    // ueditor编辑器上传图片处理
    public function ue_upimg() {
        $info = $this->upload ();
        $pic_driver = C('EDITOR_UPLOAD_DRIVER');
        if (strtolower($pic_driver) == 'local') {
            $img = $info ['imgFile'] ['path'];
        } else {
            $img = $info ['imgFile']['url'];
        }
        $return = array ();
        $return ['id'] = $info ['imgFile'] ['id'];
        $return ['url'] = $img;
        $title = htmlspecialchars ( $_POST ['pictitle'], ENT_QUOTES );
        $return ['title'] = $title;
        $return ['original'] = $info ['imgFile'] ['name'];
        $return ['state'] = ($img) ? 'SUCCESS' : $this->uploader->getError ();
        /* 返回JSON数据 */
        $this->ajaxReturn ( $return );
    }
    // ueditor编辑器在线管理处理
    // 扫描目录下(包括子文件夹)的图片并返回
    public function ue_mgimg() {
        $setting = C ( 'EDITOR_UPLOAD' );
        $imgRootPath = $setting ['rootPath'];
        $paths = array ('');
        $files = array ();
        $files = $this->getfiles ( $imgRootPath );
        if (! count ( $files ))
            return;
        rsort ( $files, SORT_STRING );
        $str = implode ( '|', $files );
        echo $str;
    }
    /**
     * 遍历获取目录下的指定类型的文件
     *
     * @param
     *          $path
     * @param array $files          
     * @return array
     */
    function getfiles($path, &$files = array()) {
        if (! is_dir ( $path ))
            return null;
        $handle = opendir ( $path );
        while ( false !== ($file = readdir ( $handle )) ) {
            if ($file != '.' && $file != '..') {
                $path2 = $path . '/' . $file;
                if (is_dir ( $path2 )) {
                    $this->getfiles ( $path2, $files );
                } else {
                    if (preg_match ( "/.(gif|jpeg|jpg|png|bmp)$/i", $file )) {
                        // $files[] = '/dev/'.$path2;
                        $files [] = __ROOT__ . '/' . ltrim ( ltrim ( $path2, '.' ), '/' );
                    }
                }
            }
        }
        return $files;
    }
    /**
     * 检测当前上传的文件是否已经存在
     *
     * @param array $file
     *          文件上传数组
     * @return boolean 文件信息, false - 不存在该文件
     */
    public function isFile($file) {
        if (empty ( $file ['md5'] )) {
            throw new Exception ( '缺少参数:md5' );
        }
        /* 查找文件 */
        $map = array (
                'md5' => $file ['md5'],
                'sha1' => $file ['sha1'] 
        );
        return M ( 'Picture' )->field ( true )->where ( $map )->find ();
    }
}
OK,到此结束,后台上传的文件和图片,即保存在OSS服务器上了~~这些文件和图片的信息,保存在onethink_file和onethink_picture表中,在前端页面调用图片和文件就从这俩模型里调出即可
这些配置的研究花了不少时间,希望能帮到你~~
点赞(3) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部