thinkphp整合系列之阿里云oss

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

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

如果上传的文件都和网站程序源代码放在一起;那是有相当多的弊端的;

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

2:服务器的成本略高;

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

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

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

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

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

一:准备工作

1:申请key和secret

白俊遥博客

2:创建Bucket

白俊遥博客

需要注意的是要把读写权限改为: 公共读;


白俊遥博客

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

白俊遥博客

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

二:填写配置项

依然是以项目示例:https://github.com/baijunyao/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文件夹拷贝到自己项目同目录下;

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

//*******************************回复鹤山童鞋的分割线************************

鹤山童鞋的要求;这里增加了删除oss上的文件的函数

/**
 * 删除oss上指定文件
 * @param  string $object 文件路径 例如删除 /Public/README.md文件  传Public/README.md 即可
 */
function oss_delet_object($object){
    // 实例化oss类
    $oss=new_oss();
    // 获取bucket名称
    $bucket=C('ALIOSS_CONFIG.BUCKET');
    $test=$oss->deleteObject($bucket,$object);
}

方法还是挺简单的;唯一需要注意的是注释中写的路径的问题;

白俊遥博客
请先登陆后发表评论
  • 最新评论
  • 总共14条评论
白俊遥博客

Oo雨的印记oO:SignatureDoesNotMatch 大神请问我出现这个错误,我确定我的id和secret都是正确的,都是直接复制的

2016-11-18 16:07:40 回复

白俊遥博客
  • 云淡风晴 回复 Oo雨的印记oO:意思是说签名错误;如果都确认无误;可以找阿里的客服看下;
  • 2016-12-05 23:16:13 回复
白俊遥博客

花无不缺你一个:代码显示有问题哦~

2016-11-11 17:04:42 回复

白俊遥博客

拖风传去的一份信:您好,请问您有二次开发过的ueditor上传图片到阿里云的代码吗,我是新手,不知道怎么二次开发这个?

2016-11-06 20:00:38 回复

白俊遥博客
  • 云淡风晴 回复 拖风传去的一份信:已经有ueditor 直接上传到oss的示例了;https://github.com/XieXianbin/UEditor-for-aliyun-OSS
  • 2016-11-07 22:42:46 回复
白俊遥博客

王轩:你这个上传文件是先把文件存到自己服务器,然后获取路径在上传到阿里云服务器,然后在把自己服务器的文件删掉.对吗?可以不经过自己服务器吗    直接从客户端操作上传文件到阿里云服务器 ? 

2016-09-09 13:50:04 回复

白俊遥博客
  • 云淡风晴 回复 王轩:是的;这个流程是文件首先上传到服务器上保存一份;然后再上传到oss上;访问的时候都是访问的oss上的资源;服务器上的作为备份;如果不需要备份;可以上传完自动删除;官方的文档中也是有直接上传到oss上的;
  • 2016-09-10 00:13:04 回复
白俊遥博客
  • 拖风传去的一份信 回复 云淡风晴:博主,图片怎么直接上传阿里云返回链接,比较着急, 希望博主尽快回复,感谢!
  • 2016-11-07 09:20:03 回复
白俊遥博客

公子开明:帅白   在线等你呀

2016-08-18 21:06:42 回复

白俊遥博客
  • 云淡风晴 回复 公子开明:不好意思;刚忙完看博客;
  • 2016-08-18 22:02:03 回复
白俊遥博客

公子开明:按照帅白的文章一步一步做下去了    但是发布产品 图片还是在本地 没有上传到OSS。  是不是本地测试会这样呢    我现在用的这套系统是别人开发的 是不是因为这个原因呢  

2016-08-18 13:19:08 回复

白俊遥博客
  • 云淡风晴 回复 公子开明:有报错信息么?
  • 2016-08-18 22:01:52 回复
白俊遥博客

少主:就是写一个页面然后直接调用oss_upload方法就可以了是吗?

2016-08-17 10:51:38 回复

白俊遥博客
  • 云淡风晴 回复 少主:是的;
  • 2016-08-17 20:22:18 回复
白俊遥博客

小白:感谢博主,调试可以了。希望有时间出个七牛存储的文章。

2016-08-12 16:23:19 回复

白俊遥博客
  • 云淡风晴 回复 小白:好的;
  • 2016-08-14 01:15:26 回复
白俊遥博客

:受教,先收藏,估计以后有用

2016-08-05 14:37:01 回复

白俊遥博客

郑颖-小牛顿:为啥我这传完 啥也没有呢  没有返回值  oss上也没有图片

2016-07-14 16:34:17 回复

白俊遥博客
  • 云淡风晴 回复 郑颖-小牛顿:直接调用oss_upload()函数传一个本地文件的路径看可以成功上传不?
  • 2016-07-14 16:44:43 回复
白俊遥博客

ManGo:有没有前端的示例和获取回调地址的示例?

2016-07-13 17:13:31 回复

白俊遥博客

鹤山:请先登陆后发表评论

2016-07-08 09:00:57 回复

白俊遥博客

鹤山:能不能出一个删除oss图片的教程呢! 非常期待啊!

2016-07-07 10:20:50 回复

白俊遥博客
  • 云淡风晴 回复 鹤山:可以;容我腾开手就写;
  • 2016-07-07 23:23:03 回复
白俊遥博客
  • 鹤山 回复 云淡风晴:十分期待呀!
  • 2016-07-08 09:00:45 回复
白俊遥博客
  • 云淡风晴 回复 鹤山:已经添加至文章的结尾部分;
  • 2016-07-08 12:35:07 回复
白俊遥博客
  • 鹤山 回复 云淡风晴:谢谢,
  • 2016-07-08 12:48:09 回复
白俊遥博客

那年,烟雨重楼白俊遥博客加个友链呗,青春博客 loveteemo.com

2016-05-17 16:53:40 回复

白俊遥博客
  • 云淡风晴 回复 那年,烟雨重楼:好的;已加;
  • 2016-05-17 17:03:24 回复