ThinkPHP5整合阿里云oss
水冷眸目前手中的一个项目,用得Thinkphp5.0.4制作的,基于访问速度、容灾备份,以及受攻击迅速切换等各方面考虑,程序源代码跟项目中所使用的静态文件、媒体文件都将分开存放。
现如今是一个“云”时代,在初期,乃至后期,我们都不需要专门去为这些分类去购买更多的服务器,而是直接使用云服务商所提供的各类增值功能就能很好的完成这一步。
本项目这次选用的是阿里云的OSS,通过官方给出的开发文档,以及Thinkphp5框架良好的类库扩展功能,将OSS整合进项目当中。
当然,类似阿里云OSS的提供商有很多,但是我们不是来讨论孰优孰劣,而是直接上干货的。
一:准备工作
1:申请Access Key ID和Access Key Secret,以及创建好你的Bucket;
(创建Bucket也可以通过开发文档给出的接口,在自己的项目中操作,但是水冷眸的项目中目前不需要这个功能,因此就跳过了。)
2:根据服务器的位置获取外网endpoint;https://help.aliyun.com/document_detail/31837.html
ok,以上准备工作完成,就可以正式开始着手整合了。
二:安装阿里云OSS的SDK;
关于安装OSS的PHP-SDK的方法,官方给出了三种方式,因为本身Thinkphp5版本,官方也是极度推荐通过composer方式来管理我们的项目依赖,所以水冷眸也是在上手了Thinkphp5之后,小小的百度一下composer到底是个什么东西,但是这不是这篇文章的重点,因此跳过,只说水冷眸的操作过程,有兴趣的朋友可以自行百度composer。
在项目的根目录下,按住shift键并右键打开菜单,选择在此处打开命令行。
然后复制阿里云官方给出的命令行,在命令行窗口点击右键进行粘贴,并回车执行。(略慢,有条件的朋友上梯子,没有的朋友,也请耐心等待。)
composer require aliyuncs/oss-sdk-php
最后出现如下图标识,即为安装成功。
同时,你的项目下的vendor文件夹内,也将出现一个aliyuncs的文件夹,里面的文件就是OSS库文件,以及演示文件,具体的目录说明,可以点此查看,官方给出具体说明的东西,水冷眸就不再赘述了。
三:填写配置项
配置项写在哪里这个各人有各人的喜好,在本文中,水冷眸则是放进应用公共配置文件中,也就是应用目录下的config.php里面。
1 2 3 4 5 6 7 |
//阿里云OSS配置 'aliyun_oss' => [ 'KeyId' => '', //您的Access Key ID 'KeySecret' => '', //您的Access Key Secret 'Endpoint' => '', //阿里云oss 外网地址endpoint 'Bucket' => '', //Bucket名称 ], |
四:实例化并上传
1:实例化
1 2 3 4 5 6 7 8 9 10 11 12 |
/** * 实例化阿里云OSS * @return object 实例化得到的对象 * @return 此步作为共用对象,可提供给多个模块统一调用 */ function new_oss(){ //获取配置项,并赋值给对象$config $config=config('aliyun_oss'); //实例化OSS $oss=new \OSS\OssClient($config['KeyId'],$config['KeySecret'],$config['Endpoint']); return $oss; } |
2:根据官方演示代码,制作上传模块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
/** * 上传指定的本地文件内容 * * @param OssClient $ossClient OSSClient实例 * @param string $bucket 存储空间名称 * @param string $object 上传的文件名称 * @param string $Path 本地文件路径 * @return null */ function uploadFile($bucket,$object,$Path){ //try 要执行的代码,如果代码执行过程中某一条语句发生异常,则程序直接跳转到CATCH块中,由$e收集错误信息和显示 try{ //没忘吧,new_oss()是我们上一步所写的自定义函数 $ossClient = new_oss(); //uploadFile的上传方法 $ossClient->uploadFile($bucket, $object, $Path); } catch(OssException $e) { //如果出错这里返回报错信息 return $e->getMessage(); } //否则,完成上传操作 return true; } |
上面两段代码,均是放在公共模块函数文件里面,在有需要的地方,直接调用uploadFile
即可
代码挺简单,仔细看代码的注释,想来你看到本篇教程,又看到最后的,有了注释,要集成也不是什么难事吧。
教程粗糙,各位海涵。目前来说,上面的代码在水冷眸自己的项目中已经测试通过,如有问题,欢迎评论拍砖。
调用上传方法后,没有返回上传文件的路径吗?还是路径是自己配置的,再结合文件名拼接起来呢?没有使用oss,最近也好奇想研究下。
yao100 于2016-12-25 1:54 下午 评论我是手工配置的、因为整合的时候,我是单纯的用作上传头像,文件上传后是直接放在根目录。所以只是域名+文件名就可以了。
水冷眸丶 于2016-12-27 8:46 上午 评论感觉还是能加上返回文件路径更方便管理。
yao100 于2016-12-27 9:10 上午 评论这个有必要,再过几天,制作到文章发布模块的时候,会用到用户端直传到OSS以及上传后的路径返回。届时做完后会将代码共享。
水冷眸丶 于2016-12-27 10:54 上午 评论好的感谢分享,公司暂时使用微软azure,以后会考虑使用阿里云
yao100 于2016-12-27 10:55 上午 评论没看到联系方式啊
扫地僧 于2017-07-20 11:25 上午 评论我想把上传的图片自动转换成webp的格式,这个怎么弄呢老大
扫地僧 于2017-07-20 11:55 上午 评论