JohnLui/AliyunOSS v2.0 发布,大幅优化了 API 易用性,改进了文件结构

2015-1-9   /   阅读数:50745   /   分类: PHP
    ___     __    _                                    ____    _____   _____
   /   |   / /   (_)   __  __  __  __   ____          / __ \  / ___/  / ___/
  / /| |  / /   / /   / / / / / / / /  / __ \        / / / /  \__ \   \__ \
 / ___ | / /   / /   / /_/ / / /_/ /  / / / /       / /_/ /  ___/ /  ___/ /
/_/  |_|/_/   /_/    \__, /  \__,_/  /_/ /_/        \____/  /____/  /____/
                    /____/  

适配 Laravel 7 的新包已经发布:AliyunOSS-Laravel7

AliyunOSS 是阿里云 OSS 官方 SDK 的 Composer 封装,支持任何 PHP 项目,包括 Laravel、Symfony、TinyLara 等等。Github 地址:https://github.com/johnlui/AliyunOSS

更新记录

  • 2017-03-08 Release v2.0.0 v2 发布,在 API 易用性上进行了大量优化

  • 2016-09-12 Release v1.3.5 加入文件元信息的设置功能

  • 2016-07-20 Release v1.3.4 加入文件元信息的获取功能

  • 2016-07-20 Release v1.3.4 加入文件元信息的获取功能

  • 2016-01-31 Release v1.3.2 获取指定虚拟文件夹下的所有文件

  • 2015-10-23 Release v1.3 增加删除、复制、移动文件功能

  • 2015-08-07 Release v1.2 修复内存泄露 bug

  • 2015-01-12 Release v1.1 增加内外网配置分离

  • 2015-01-09 Release v1.0 完善功能,增加 Laravel 框架详细使用教程及代码

安装

安装有两种方式:

① 直接编辑配置文件

将以下内容增加到 composer.json:

require: {
    "johnlui/aliyun-oss": "~2.0"
}

然后运行 composer update

② 执行命令安装

运行命令:

composer require johnlui/aliyun-oss:~2.0

使用(以 Laravel 为例)

构建 Service 文件

新建 app/services/OSS.php,内容可参考:OSS.php,然后修改配置:

... ...

  private $city = '青岛';

  // 经典网络 or VPC

  private $networkType = '经典网络';

  private $AccessKeyId = '';

  private $AccessKeySecret = '';

... ...

放入自动加载

遵循 psr-0 的项目(如Laravel 4、CodeIgniter、TinyLara)中:

在 composer.json 中 autoload -> classmap 处增加配置:

"autoload": {
    "classmap": [
      "app/services"
    ]
  }

然后运行 composer dump-autoload。

遵循 psr-4 的项目(如 Laravel 5、Symfony)中:

无需配置,保证目录 App/Services 和命名空间 namespace App\Services; 一致即可自动加载。

使用

use App\Services\OSS;

// 在外网上传一个文件并指定 options 如:Content-Type 类型

// 更多 options 见:https://github.com/johnlui/AliyunOSS/blob/master/src/oss/src/Aliyun/OSS/OSSClient.php#L142-L148

OSS::publicUpload('bucket', '目标 object 名', '本地文件路径', [
    'ContentType' => 'application/pdf',
    ... ...
]);

更多用法等待着你去发现:https://github.com/johnlui/AliyunOSS/blob/master/example/OSS.php

反馈

有问题请在本文下面留言。

License

除 “版权所有(C)阿里云计算有限公司” 的代码文件外,遵循 MIT license 开源。

WRITTEN BY

avatar

评论:

ribbon
2021-06-23 15:31
怎么获得oss直接可以访问的链接,而不是下载
JohnLui
2021-06-23 17:01
@ribbon:需要在上传的时候指定正确的 content-type
哒哒
2021-06-01 17:27
同样php版本配置的两台服务器,代码相同一台可以使用,一台不可用。报错如下,麻烦大神帮忙看看,框架使用的tp5.1,使用的composer拉取的代码,使用oss版本为最新版本2.0,我看这个问题,在楼上评论中也有几个人遇到了,不知道有解决方法没。
[0] ThrowableError in EventDispatcher.php line 48
类型错误: Argument 1 passed to Symfony\Component\EventDispatcher\EventDispatcher::dispatch() must be an object, string given, called in /www/wwwroot/jiaoyou_web/vendor/johnlui/aliyun-oss/src/oss/libs/guzzle/common/Guzzle/Common/AbstractHasDispatcher.php on line 40
    {
        if (__CLASS__ === static::class) {
            $this->optimized = [];
        }
    }

    /**
     * {@inheritdoc}
     */
    public function dispatch(object $event, string $eventName = null): object
    {
        $eventName = $eventName ?? \get_class($event);

        if (null !== $this->optimized) {
            $listeners = $this->optimized[$eventName] ?? (empty($this->listeners[$eventName]) ? [] : $this->optimizeListeners($eventName));
        } else {
            $listeners = $this->getListeners($eventName);
        }

Call Stack
in EventDispatcher.php line 48
at EventDispatcher->dispatch('client.create_reques...', object(Event)) in AbstractHasDispatcher.php line 40
at AbstractHasDispatcher->dispatch('client.create_reques...', ['client' => object(Client), 'request' => object(EntityEnclosingRequest)]) in Client.php line 450
at Client->prepareRequest(object(EntityEnclosingRequest), []) in Client.php line 199
at Client->createRequest('PUT', 'http://test-jiaoyou....', ['Content-Length' => '12227', 'Content-Type' => 'application/octet-st...', 'Date' => 'Tue, 01 Jun 2021 09:...', ...], object(ReadLimitEntityBody)) in HttpServiceClient.php line 119
at HttpServiceClient->buildCoreRequest(object(HttpRequest)) in HttpServiceClient.php line 56
at HttpServiceClient->sendRequest(object(HttpRequest), object(ExecutionContext)) in OpenServiceClient.php line 37
at OpenServiceClient->sendRequest(object(HttpRequest), object(ExecutionContext)) in RetryableServiceClient.php line 32
at RetryableServiceClient->sendRequestImpl(object(HttpRequest), object(ExecutionContext), 0) in RetryableServiceClient.php line 27
at RetryableServiceClient->sendRequest(object(HttpRequest), object(ExecutionContext)) in Command.php line 121
at Command->execute(['Endpoint' => 'http://oss-cn-shenzh...', 'AccessKeyId' => 'LTAIeOopj0aHBw7Y', 'AccessKeySecret' => 'HsdlmsiBVIorEwGTLs1E...'], ['Bucket' => 'test-jiaoyou', 'Key' => 'jiaoyou/jyaaaaaaaaaa...', 'Content' => resource, ...]) in OSSClient.php line 429
at OSSClient->execute('putObject', ['Bucket' => 'test-jiaoyou', 'Key' => 'jiaoyou/jyaaaaaaaaaa...', 'Content' => resource, ...]) in OSSClient.php line 153
at OSSClient->putObject(['Bucket' => 'test-jiaoyou', 'Key' => 'jiaoyou/jyaaaaaaaaaa...', 'Content' => resource, ...]) in AliyunOSS.php line 101
at AliyunOSS->uploadFile('jiaoyou/jyaaaaaaaaaa...', '/www/wwwroot/jiaoyou...', []) in FileLogic.php line 141
at FileLogic::ossUploadFile('/www/wwwroot/jiaoyou...', 'teacher', '', 1, '', []) in FileLogic.php line 96
at FileLogic::uploadLocalFile('/www/wwwroot/jiaoyou...', 'teacher') in Test.php line 99
at Test->upload()
at ReflectionMethod->invokeArgs(object(Test), []) in Container.php line 395
at Container->invokeReflectMethod(object(Test), object(ReflectionMethod), ['s' => '//admin/web.test/upl...']) in Module.php line 131
at Module->think\route\dispatch\{closure}(object(Request), object(Closure), null)
at call_user_func_array(object(Closure), [object(Request), object(Closure), null]) in Middleware.php line 185
at Middleware->think\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Middleware.php line 130
at Middleware->dispatch(object(Request), 'controller') in Module.php line 136
at Module->exec() in Dispatch.php line 168
at Dispatch->run() in App.php line 432
at App->think\{closure}(object(Request), object(Closure), null)
at call_user_func_array(object(Closure), [object(Request), object(Closure), null]) in Middleware.php line 185
at Middleware->think\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Middleware.php line 130
at Middleware->dispatch(object(Request)) in App.php line 435
at App->run() in index.php line 26

2020-12-23 14:43
我想在上传文件的时候就进行图片缩放,怎么做呢?是不是不支持?
我看文档里面是有的 常量OSS_PROCESS  和方法getObject我都没找到
JohnLui
2020-12-23 14:45
@龙:目前不支持图片处理

2020-12-23 14:51
@JohnLui:这个是官方SDk的精简版吗,我看写的是在其基础上封装的啊.感觉这种文件处理还是有必要
JohnLui
2020-12-23 14:53
@龙:这个库发布于 2015 年 1 月,当时官方没有 composer SDK,所以这个库的功能也不太完善。现在官方出了 composer SDK,可以选择用那个。我保持这个库的更新也是为了老用户和我公司自己的需求。

2020-12-23 14:56
@JohnLui:哦哦,明白了.感谢!!! 我这也是老项目,才发现不是官方SDK
wudiyunxing
2020-10-15 16:53
版本低,换成
composer require johnlui/aliyun-oss-laravel7:~3.0
tigerx
2020-09-01 14:35
'Expires' => new \DateTime("+5 minutes")
过期时间是这么设置的么,为什么不生效呢
miralce
2020-08-28 17:23
在加载阿里云图片搜索服务时composer require alibabacloud/imagesearch-20200212 报错
Fatal error: Cannot declare class Symfony\Component\ClassLoader\UniversalClassLoader, because the name is already in use in /home/wwwroot/app/vendor/johnlui/aliyun-oss-laravel7/src/oss/libs/symfony/class-loader/Symfony/Component/ClassLoader/UniversalClassLoader.php on line 61

怎么避免引入文件冲突
puppet
2020-05-21 21:40
博主您好,OSS设置文件的Content-Type(MIME)是否有封装,或者文档说明?感谢
JohnLui
2020-05-22 09:53
@puppet:OSS::publicUpload('bucket', '目标 object 名', '本地文件路径', [
    'ContentType' => 'application/pdf',
    ... ...
]);

仔细看嘛,示例代码就是啊
lihn
2020-04-07 16:50
message: "Argument 1 passed to Symfony\Component\EventDispatcher\EventDispatcher::dispatch() must be an object, string given, called in E:\dahepaio\root\backstage\vendor\johnlui\aliyun-oss\src\oss\libs\guzzle\common\Guzzle\Common\AbstractHasDispatcher.php on line 40"

laravel版本 -- Laravel Framework 7.2.2
its
2020-06-24 15:09
@lihn:我也遇到了跟你同样的问题...
wudiyunxing
2020-10-15 10:52
@lihn:请问如何解决的?
harriswong
2020-01-07 11:45
请问上传的时候怎么设置header呢?putObject方法的第四个参数 $options支持传入数组,我传入['Cache-Control'=>'max-age=1000']为何不生效呢?
M
2020-02-16 18:54
@harriswong:这个太老了,很多方法都没有,很久没更新了
嗷嗷嗷嗷
2019-09-30 09:43
请问 我用 getPublicObjectURL这个方法 传入bucket名称 和一个上传文件返回的ETAG 然后获取 文件访问URL  
返回结果 :"http://phpnb.oss-cn-hongkong.aliyuncs.com/89005FCCF6D9D2126A29CCFF9DAEAC52"
请问 大佬 我是上传的图片 怎么能让他直接显示啊?
小猪猪
2019-08-22 17:10
//oss容器名称
$bucket = '*******‘
我现在的情况是:
我的阿里oss  有一个bucket名为 blog,在blog下面有很多二级或三级目录
当我用这个插件把bucket设置为blog时,图片能正常上传到该目录下
但是我想把图片上传到二级目录,也就是blog/picture等
我试图把bucket名定义为 /blog/picture  运行的时候发现行不通
请帮帮忙~!
大屁孩
2019-03-14 16:49
您好 如何获取上传的时候错误信息呢 现在没有返回任何信息只有false 如何开启debug模式呢
kiki123
2019-01-28 15:04
如果判断文件是否已存在?oss官方方法doesObjectExist在这里似乎没有啊
xue
2019-04-09 15:17
@kiki123:大哥,你是怎么解决这个问题的?
大屁孩
2018-12-20 14:04
站长你好,
        如何获取视频文件的详细信息 这个接口是否有封装呢?
JohnLui
2018-12-20 14:06
@大屁孩:木有
大屁孩
2018-12-20 14:07
@JohnLui:好的谢谢
大伟
2018-08-01 14:26
站长,你好,OSS的删除方法没有返回值,那么我该如何判断删除成功了呢

2018-07-03 13:37
总是报错 请求超时    请求时间大于30s
xfwang
2018-07-02 20:14
大神好,我调用AliyunOSS.php里面的getObjectMeta方法想获取文件的基本信息,但是一直返回The specified key does not exist

这个是什么原因呀,用AliyunOSS.php里面的getUrl方法都能正常获取到图片下载地址呢,求解答呀
komavenn
2018-06-19 13:34
转为二进制图片上传还是报这个错误
晨晨
2018-06-01 11:10
"Too few arguments to function JohnLui\AliyunOSS::boot(), 3 passed in /home/wwwroot/dev.api.miyin.com/app/services/OSS.php on line 25 and exactly 5 expected"
Symfony\Component\Debug\Exception\FatalThrowableError
/vendor/johnlui/aliyun-oss/src/AliyunOSS.php86
86行内容是    public static function boot($city, $networkType, $isInternal, $AccessKeyId, $AccessKeySecret)
  
请问 在app/services/oss.php文件   从您Git上粘贴下来  还有要修改的地方吗?

vendor下的包里 vendor/johnlui/aliyun-oss/src/AliyunOSS.php里还有要  改的地方吗
JohnLui
2018-06-01 11:32
@晨晨:你确定你是粘下来的? https://github.com/johnlui/AliyunOSS/blob/master/example/OSS.php  这个文件第 25 行是空格。
晨晨
2018-05-31 18:56
您好 我 有两个问题
1 . require: "johnlui/aliyun-oss": "~2.0"以后,再composer update , vendor 里并没有aliyun-oss这个文件 夹是正常吗?

新建了app/services/OSS.php文件后,就报错了 说找不到文件中use JohnLui\AliyunOSS\AliyunOSS; 这个类

发表评论:

© 2011-2021 岁寒  |  Powered by Emlog