thinkphp集成系列之阿里云oss

Wesley13
• 阅读 518

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

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

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

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

2:服务器的成本略高;

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

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

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

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

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

一:准备工作

1:申请key和secret

thinkphp集成系列之阿里云oss

2:创建Bucket

thinkphp集成系列之阿里云oss

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

thinkphp集成系列之阿里云oss

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

thinkphp集成系列之阿里云oss

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;             }         }                     }

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

thinkphp集成系列之阿里云oss

然后在配置项中设置哪些目录的文件自动上传到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

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Peter20 Peter20
3年前
mysql中like用法
like的通配符有两种%(百分号):代表零个、一个或者多个字符。\(下划线):代表一个数字或者字符。1\.name以"李"开头wherenamelike'李%'2\.name中包含"云",“云”可以在任何位置wherenamelike'%云%'3\.第二个和第三个字符是0的值wheresalarylike'\00%'4\
Karen110 Karen110
2年前
​一篇文章总结一下Python库中关于时间的常见操作
前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在
Wesley13 Wesley13
2年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Wesley13 Wesley13
2年前
Java多线程导致的的一个事物性问题
业务场景我们现在有一个类似于文件上传的功能,各个子站点接受业务,业务上传文件,各个子站点的文件需要提交到总站点保存,文件是按批次提交到总站点的,也就是说,一个批次下面约有几百个文件。      考虑到白天提交这么多文件会影响到子站点其他系统带宽,我们将分站点的文件提交到总站点这个操作过程独立出来,放到晚上来做,具体时间是晚上7:00到早上7:00。
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这