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);
}
方法还是挺简单的;唯一需要注意的是注释中写的路径的问题;
本文为白俊遥原创文章,转载无需和我联系,但请注明来自白俊遥博客https://baijunyao.com 欢迎捐赠赞赏加入组织创建QQ群及捐赠渠道
cyberwin :牛
2020-02-20 01:21:54 回复
分不清的'殇 :如何生成缩略图呀
2018-05-02 12:00:05 回复
久沉深海心必凉i :2a58d88b22c830c7df211615915f0ef2请问如何实现文件断点上传到OSS?
2018-01-24 16:12:38 回复
折子戏 :博主可以开发直传到阿里云OSS的功能吗?可以讲解一下UE编辑器下如何直传阿里云吗?
2018-01-23 19:59:31 回复
Kurapica :请问如何实现文件断点上传到OSS?
2017-09-30 15:07:33 回复
一杯のお茶 :白兄,相互关注下,我的博客是:www.oaiyou.com 谢谢
2017-08-18 13:02:27 回复
五儿 :不了不了,呵呵哒
2017-09-15 10:04:40 回复
har :建议你以类的方式封装,代码太过于零散
2017-08-18 10:11:15 回复
爱便流通于世 :unlink($path);中$path左侧好像有/ unlink语法好像没有/才能删除,改成unlink($oss_path);就可以上传到oss成功后删除本地文件名的文件!
2017-06-19 16:02:42 回复
HelloSun :楼主主要方法也不用引用阿里的SDK了吗,直接调用自己封装的吗
2017-03-07 11:42:44 回复
爱便流通于世 :肯定用了呀?/** * 实例化阿里云oos * @return object 实例化得到的对象 */ ; $c"token punctuation">; $oss=new
2017-06-19 16:03:52 回复
守住信念丶 :一直显示Class 'OSS\OssClient' not found 这个是咋回事,博主大大求解答啊,完全按照步骤来的
2017-02-27 15:27:31 回复
妥拾微凉ゝ/oh :\OSS\OssClient
2017-03-06 11:16:56 回复
Fesa :我的笔记本测试也是这样。另外一台电脑就不会 同样代码
2017-03-20 23:04:05 回复
ray :您是怎么解决这个问题的?
2017-09-01 21:09:00 回复
付先森 :楼主啊,我这个是3.1.2版本的tp框架啊,该咋整啊
2017-02-23 20:22:42 回复
付先森 :帅白楼主啊,我想看看你这个的HTML模板的代码啊,跪求
2017-02-23 19:45:50 回复
不相问便各自安好 :oss 能够实现多图上传吗? 帅白
2017-02-08 15:05:50 回复
北有先生_ :大哥 我想问下 提交的 html 是自己写的吗?您那 有没有模板看下 我是小白
2016-12-15 09:45:45 回复
云淡风晴 :可以参考thinkphp官方手册的上传form:http://document.thinkphp.cn/manual_3_2.html#upload
2016-12-22 23:04:18 回复
TAB :
2018-01-23 20:02:36 回复
礼佛 :说阿里的文档写的和屎一样 还不如说人家业务大 不能怪人家 看了一星期不知道怎么下手 看完这篇博客仿佛找到了新大陆 谢谢楼主 ps:获取外网endpoint地址换成这个了:https://help.aliyun.com/document_detail/31837.html?spm=5176.doc31836.6.560.kww3fG
2016-12-14 18:05:18 回复
北有先生_ :你的成功了吗???我这边配合了提交的表格是自己写的吗?
2016-12-15 09:46:40 回复
五儿 :噗。。你别他么逗我了
2017-08-18 15:01:57 回复
hiwangqi :支持下
2018-01-24 20:24:13 回复
Oo雨的印记oO :SignatureDoesNotMatch 大神请问我出现这个错误,我确定我的id和secret都是正确的,都是直接复制的
2016-11-18 16:07:40 回复
云淡风晴 :意思是说签名错误;如果都确认无误;可以找阿里的客服看下;
2016-12-05 23:16:13 回复
:endpoint前面不要加bucket名称,这样就没问题了
2017-05-05 21:21:11 回复
hiwangqi :很不错哟
2018-01-24 20:23:08 回复
花无不缺你一个 :代码显示有问题哦~
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 回复
北有先生_ :你的问题解决了吗?我这还没有解决
2016-12-15 09:47:41 回复
少主 :就是写一个页面然后直接调用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 回复
最新评论