thinkphp集成系列之阿里云oss

web2.0时代;除了纯信息展现类的网站;基本都是有文件上传功能的;php

最不济你得让用户换个头像吧;可是随着业务的发展;html

若是上传的文件都和网站程序源代码放在一块儿;那是有至关多的弊端的;ios

1:静态文件会占用大量带宽;git

2:服务器的成本略高;web

常规的作法是把php源代码放到一台服务器上;图片等静态文件放在另外一台服务器上;thinkphp

当一个神奇的“云”时代的到来后;一切就变的更加简单了;服务器

在业务还比较小的时候;咱们无需大费周折的去搞一台静态文件服务器;直接使用第三方的便可;网络

好了;洛里啰嗦了半天;下面请出本篇博客的主角:阿里云oss;框架

我就再也不安利oss的优点了;还没了解过的先跟着这个连接走:https://www.aliyun.com/product/oss/ide

一:准备工做

1:申请key和secret

白俊遥博客

2:建立Bucket

白俊遥博客

须要注意的是要把读写权限改成: 公共读;

 

白俊遥博客

根据服务器的位置获取外网endpoint;https://help.aliyun.com/document_detail/31834.html

白俊遥博客

ok;凑齐了这些配置项;下面能够召唤神龙了;

二:填写配置项

依然是以项目示例:http://git.oschina.net/shuaibai123/thinkphp-bjyadmin

/Application/Common/Conf/config.php

    'ALIOSS_CONFIG'          => array(
        'KEY_ID'             => '', // 阿里云oss key_id
        'KEY_SECRET'         => '', // 阿里云oss key_secret
        'END_POINT'          => '', // 阿里云oss endpoint
        'BUCKET'             => ''  // bucken 名称
        ),

三:实例化并上传

/Application/Common/Common/function.php

/**
 * 实例化阿里云oos
 * @return object 实例化获得的对象
 */
function new_oss(){
    vendor('Alioss.autoload');
    $config=C('ALIOSS_CONFIG');
    $oss=new \OSS\OssClient($config['KEY_ID'],$config['KEY_SECRET'],$config['END_POINT']);
    return $oss;
}

/**
 * 上传文件到oss并删除本地文件
 * @param  string $path 文件路径
 * @return bollear      是否上传
 */
function oss_upload($path){
    // 获取配置项
    $bucket=C('ALIOSS_CONFIG.BUCKET');
    // 先统一去除左侧的.或者/ 再添加./
    $oss_path=ltrim($path,'./');
    $path='./'.$oss_path;
    if (file_exists($path)) {
        // 实例化oss类
        $oss=new_oss();
        // 上传到oss    
        $oss->uploadFile($bucket,$oss_path,$path);
        // 如需上传到oss后 自动删除本地的文件 则删除下面的注释 
        // unlink($path);
        return true;
    }
    return false;
}

 

ok如今首先使用框架的Upload上传类上传文件到服务器;得到文件路径;

调用oss_upload()函数;传入得到的文件路径;便可把文件上传到oss;

四:便捷方式

看第三步;咱们能够发现;每上传一个文件就要调用oss_upload()函数;

那可不能够上传文件之后自动就上传到oss呢?

固然能够了;可是咱们要对框架的Upload作点手术;

在 /ThinkPHP/Library/Think/Upload.class.php  的第229行添加以下代码;

//*************************添加部分开始*************************
// 判断是否上传成功
if (!empty($info)) {
    // 获取须要上传到oss的目录
    $need_upload_oos=C('NEED_UPLOAD_OSS');
    foreach ($info as $k => $v) {
        // 判断此路径是否须要上传到oss
        foreach ($need_upload_oos as $m => $n) {
            if (strpos($v['savepath'], $n)!==false) {
                // 上传到oss
                oss_upload($v['savepath'].$v['savename']);
                continue;
            }
        }                
    }

}
//*************************添加部分结束*************************

白俊遥博客

而后在配置项中设置哪些目录的文件自动上传到oss;

/Application/Common/Conf/config.php

'NEED_UPLOAD_OSS'        => array( // 须要上传的目录
    '/Upload/avatar',
    '/Upload/cover',
    '/Upload/image/webuploader',
    '/Upload/video',
    ),

若是只有个别目不上传、或者是全部目录都上传的;直接改配置项和Upload便可;

四:获取文件连接

图片之类的静态文件是上传到oss了;那连接怎么获取呢?

/Application/Common/Common/function.php

/**
 * 获取完整网络链接
 * @param  string $path 文件路径
 * @return string       http链接
 */
function get_url($path){
    // 若是是空;返回空
    if (empty($path)) {
        return '';
    }
    // 若是已经有http直接返回
    if (strpos($path, 'http://')!==false) {
        return $path;
    }
    // 获取bucket
    $bucket=C('ALIOSS_CONFIG.BUCKET');
    return 'http://'.$bucket.'.oss-cn-beijing.aliyuncs.com'.$path;
}

调用上面这个get_url()函数;传入第三步获取到的文件路径;便可获得oss的文件连接;

到此;从建立、上传、获取文件连接;整个流程就结束了;

若是要整合到本身有的项目中;

那只须要把/ThinkPHP/Library/Vendor/Alioss文件夹拷贝到本身项目同目录下;

把上面哪些配置项和函数拿过去就能够直接用;

本文为白俊遥原创文章,转载无需和我联系,但请注明来自白俊遥博客http://baijunyao.com

相关文章
相关标签/搜索