JohnLui/AliyunOSS v1.0 发布,附 Laravel 框架详细使用教程及代码

    ___     __    _                                    ____    _____   _____
   /   |   / /   (_)   __  __  __  __   ____          / __ \  / ___/  / ___/
  / /| |  / /   / /   / / / / / / / /  / __ \        / / / /  \__ \   \__ \
 / ___ | / /   / /   / /_/ / / /_/ /  / / / /       / /_/ /  ___/ /  ___/ /
/_/  |_|/_/   /_/    \__, /  \__,_/  /_/ /_/        \____/  /____/  /____/
                    /____/

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

更新记录

  • 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": "*"

}

然后运行 `composer update`。

使用(以 Laravel 为例)

构建 Service 文件

新建 `app/services/OSS.php`,内容可参考:OSSExample.php

<?php

namespace App\Services;

use JohnLui\AliyunOSS\AliyunOSS;

use Config;

class OSS {

  private $ossClient;

  public function __construct($isInternal = false)
  {
    $serverAddress = $isInternal ? Config::get('app.ossServerInternal') : Config::get('app.ossServer');
    $this->ossClient = AliyunOSS::boot(
      $serverAddress,
      Config::get('app.AccessKeyId'),
      Config::get('app.AccessKeySecret')
    );
  }

  public static function upload($ossKey, $filePath)
  {
    $oss = new OSS(true); // 上传文件使用内网,免流量费
    $oss->ossClient->setBucket('你的 bucket 名称');
    $oss->ossClient->uploadFile($ossKey, $filePath);
  }
  /**
   * 直接把变量内容上传到oss
   * @param $osskey
   * @param $content
   */
  public static function uploadContent($osskey,$content)
  {
    $oss = new OSS(true); // 上传文件使用内网,免流量费
    $oss->ossClient->setBucket('你的 bucket 名称');
    $oss->ossClient->uploadContent($osskey,$content);
  }

  /**
   * 删除存储在oss中的文件
   *
   * @param string $ossKey 存储的key(文件路径和文件名)
   * @return
   */
  public static function deleteObject($ossKey)
  {
      $oss = new OSS(true); // 上传文件使用内网,免流量费

      return $oss->ossClient->deleteObject('你的 bucket 名称', $ossKey);
  }

  /**
   * 复制存储在阿里云OSS中的Object
   *
   * @param string $sourceBuckt 复制的源Bucket
   * @param string $sourceKey - 复制的的源Object的Key
   * @param string $destBucket - 复制的目的Bucket
   * @param string $destKey - 复制的目的Object的Key
   * @return Models\CopyObjectResult
   */
  public function copyObject($sourceBuckt, $sourceKey, $destBucket, $destKey)
  {
      $oss = new OSS(true); // 上传文件使用内网,免流量费

      return $oss->ossClient->copyObject($sourceBuckt, $sourceKey, $destBucket, $destKey);
  }

  /**
   * 移动存储在阿里云OSS中的Object
   *
   * @param string $sourceBuckt 复制的源Bucket
   * @param string $sourceKey - 复制的的源Object的Key
   * @param string $destBucket - 复制的目的Bucket
   * @param string $destKey - 复制的目的Object的Key
   * @return Models\CopyObjectResult
   */
  public function moveObject($sourceBuckt, $sourceKey, $destBucket, $destKey)
  {
      $oss = new OSS(true); // 上传文件使用内网,免流量费

      return $oss->ossClient->moveObject($sourceBuckt, $sourceKey, $destBucket, $destKey);
  }

  public static function getUrl($ossKey)
  {
    $oss = new OSS();
    $oss->ossClient->setBucket('你的 bucket 名称');
    return $oss->ossClient->getUrl($ossKey, new \DateTime("+1 day"));
  }

  public static function createBucket($bucketName)
  {
    $oss = new OSS();
    return $oss->ossClient->createBucket($bucketName);
  }

  public static function getAllObjectKey($bucketName)
  {
    $oss = new OSS();
    return $oss->ossClient->getAllObjectKey($bucketName);
  }

}

放入自动加载

遵循 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;` 一致即可自动加载。

增加相关配置

在 app/config/app.php 中增加四项配置:

'ossServer' => '服务器外网地址', //青岛为 http://oss-cn-qingdao.aliyuncs.com
'ossServerInternal' => '服务器内网地址', //青岛为 http://oss-cn-qingdao-internal.aliyuncs.com
'AccessKeyId' => '阿里云给的AccessKeyId',
'AccessKeySecret' => '阿里云给的AccessKeySecret',

使用

use App\Services\OSS;

OSS::upload('文件名', '本地路径'); // 上传一个文件

echo OSS::getUrl('某个文件的名称'); // 打印出某个文件的外网链接

OSS::createBucket('一个字符串'); // 新增一个 Bucket。注意,Bucket 名称具有全局唯一性,也就是说跟其他人的 Bucket 名称也不能相同。

OSS::getAllObjectKey('某个 Bucket 名称'); // 获取该 Bucket 中所有文件的文件名,返回 Array。

常见问题

① Undefined index: host

解决方案:https://github.com/johnlui/AliyunOSS/issues/9


反馈

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

WRITTEN BY

avatar
2015.1.9   /   热度:12863   /   分类: PHP

评论:

tairy
2017-01-11 23:02
为啥我用这个包上传到阿里云的图片做了cdn加速无法访问,我直接在阿里云的后台上传的图片是可以用cdn加速域名访问的。
JohnLui
2017-01-12 10:07
@tairy:因为设置为私有了?
tairy
2017-01-12 10:41
@JohnLui:感谢回复,找到原因了,是因为我上传的时候没有设置 content type 导致传到阿里云的图片的 content type 是默认的 application/octet-stream,在调用 upload 函数的时候加上 content type 就可以了。

```
OSS::upload($avatar, storage_path('app/' . $avatar), [
            'ContentType' => mime_content_type(storage_path('app/' . $avatar)),
            'ContentDisposition' => 'inline'
        ]);
```

另外楼主提供的示例中 https://github.com/johnlui/AliyunOSS/blob/master/OSSExample.php#L23 的 upload 函数并没有接受 option 参数的形参,传了参数 $option 数组之后虽然没有报错,但是上传的图片并没有设置contenttype, 后来自己手动加上之后才可以。
Destiny
2016-12-26 11:45
博主你好,你的这个组件更新了之后,在 GitHub 上面的文档还没有更新呢,比如使用方法,我发现有一些维护中把一些如:设置 content-type 类型的方法也 pr 了但是使用方法文档却没有更新。
JohnLui
2016-12-26 11:55
@Destiny:感谢反馈~
欢迎贡献呦,在 Github 上就可以
Destiny
2016-12-26 21:10
@JohnLui:嗯,已更新。
Echo
2016-11-17 11:34
<?php

namespace App\Services;

use JohnLui\AliyunOSS\AliyunOSS;

use Config;

class OSS {

    private $ossClient;

    public function __construct($isInternal = false)
    {
        $serverAddress = $isInternal ? Config::get('app.ossServerInternal') : Config::get('app.ossServer');
        $this->ossClient = AliyunOSS::boot(
            $serverAddress,
            Config::get('app.AccessKeyId'),
            Config::get('app.AccessKeySecret')
        );
    }

use config显示undefined class config ,然后运行的话会报一下错误
InvalidArgumentException in AssertUtils.php line 55:
Key [Endpoint] was not set.
in AssertUtils.php line 55
at AssertUtils::assertSet(array('Endpoint', 'AccessKeyId', 'AccessKeySecret'), array('MaxErrorRetry' => '3', 'UserAgent' => 'aliyun-sdk-php/2.0.0-beta', 'CurlOptions' => array(), 'Endpoint' => null, 'AccessKeyId' => null, 'AccessKeySecret' => null)) in OSSClient.php line 399
at OSSClient->__construct(array('Endpoint' => null, 'AccessKeyId' => null, 'AccessKeySecret' => null)) in OSSClient.php line 54
at OSSClient::factory(array('Endpoint' => null, 'AccessKeyId' => null, 'AccessKeySecret' => null)) in AliyunOSS.php line 24
at AliyunOSS->__construct(null, null, null) in AliyunOSS.php line 29
at AliyunOSS::boot(null, null, null) in OSS.php line 20
JohnLui
2016-11-17 11:52
@Echo:去 Github 看看啦,这篇文章好久没更新了
HYB
2016-10-08 12:14
laravel 集成oss,删除文件 返回空, 结果没有删除。
oss::deleteObject();
deleteObject 这里面是访问路径还是上传路径?
寒素湘
2016-09-06 16:21
我怎么知道我上传文件是否成功呢?没有返回值和错误代码。

2016-10-25 18:52
@寒素湘:就是啊  没有返回错误
ginnerpeace
2016-08-30 16:10
您好,我请教一下。
目前1.3版本的包使用或者借鉴了官方的包了吗? aliyuncs/oss-sdk-php,如果有的话,是哪个版本呢?
罗彦
2016-07-29 00:24
作者你好我解决了,   在这里我给一些和我遇到问题的朋友解决一下,,,,遇到错误:The specified bucket is not valid.  的朋友   我在里我给你们解释一下 你们的内外地址肯定是给了http://****.oss-cn-beijing.aliyuncs.com 这里的*是指bucket名字,  然后你们调用方法的时候有传入了一个bucket的名字, 然后它给你们拼接起来 就变成了http://bucketName.bucketName.oss-cn..........com     解决方案:在配置文件里面ALIOSS_SERVER=http://oss-cn-beijing.aliyuncs.com   比如这个外网地址前面不要加上 bucket名字
回复
2016-11-03 11:44
@罗彦:好!
回复
2016-11-03 11:44
@罗彦:就是这个原因!太好了!
用户
2016-07-29 00:01
The specified bucket is not valid. 一直都是这个问题??????一点都没改动就的拉下来的, 配置都能读取到, 就是不行.:-(
用户
2016-07-28 23:01
作者你好, 请问我直接DD OSS类的构造方法里面的$ossClient, 我官输入正确的key还是错误的key返回数据里面的bucket 都是null请问这是咋回事?怎么验证我是否成功连接了OSS
supermanrocky
2016-07-10 21:36
请问怎么获取bucket下的某个文件夹内容呢? OSS::getAllObjectKey('talentlib/icon') 这个会报错,不能输入/
JohnLui
2016-07-11 00:17
@supermanrocky:OSS 这类单文件云存储,是没有所谓“文件夹”的概念的,所有文件都有一个唯一的 key 作为名称才可以被检索。这里的文件夹只是个 trick,所以自然就没有所谓获取文件夹下所有文件的方法。这只是个工具包,在寻找某项功能之前请先去 OSS 官方 SDK 里找找有没有这条 api。
supermanrocky
2016-07-08 20:19
[curl] 7: Failed to connect to talentlib.oss-us-west-1-internal.aliyuncs.com port 80:Timed out [url] https://talentlib.oss-us-west-1-internal.aliyuncs.com/ipaustralia.pdf

请问这个问题是怎么解决呢?我的endpoint都设置好了。upload出的问题,getBucket没问题的。求教。我用的是laravel 5.2。多谢!
JohnLui
2016-07-08 21:01
@supermanrocky:应该是 OSS 那边的权限设置问题?
supermanrocky
2016-07-08 23:27
@JohnLui:我解决了,我是把$oss = new OSS(false); 改成false用外网传的。不知道为什么内网不能用?!~外网就能上传了。
JohnLui
2016-07-08 23:29
@supermanrocky:OSS内网ip可能需要白名单?
supermanrocky
2016-07-10 21:23
@JohnLui:请问这个能不能获取bucket下某个文件夹的内容?OSS::getAllObjectKey('talentlib/abc')这个会报错。不能在bucket后加/
孤狼
2016-06-16 18:05
这个 SDK, 支持创建目录吗?或者 再说上传文件是自动创建目录
j955
2016-05-23 17:01
ClientException in Command.php line 135:
The scheme of endpoint is not set.

遇到了同样的问题,但外网地址什么的都设置了.dump出来查看也是有外网地址的.不知道什么原因望指教
阿德
2016-05-17 20:49
按照的自己的情况重新写了命名空间 之后提示安装curl 安装了curl 然后提示成功! 哈哈 谢谢老大的扩展包
阿德
2016-05-17 18:36
忘了说 我的laravel5.2.29
阿德
2016-05-17 18:35
已经声明了 use App\Services\OSS;
还是提示 Class 'App\Services\OSS' not found...
JohnLui
2016-05-17 18:43
@阿德:目测是命名空间用法错误
阿德
2016-05-17 19:00
@JohnLui:那我重新复习下 命名空间 。。
geta_chan
2016-05-10 17:16
哥,yii2怎么用啊
kailuo99
2016-03-21 23:33
你好:

我使用的是Laravel5.2 ,用了您的包以后,使用OSS出现

ClientException in Command.php line 135:
Undefined index: host

这个如何解决?
waken
2016-04-13 11:05
@kailuo99:你用的是内网访问
OSS.php总
$oss = new OSS(); // 上传文件使用内网,免流量费

这样定义就可以啦
Panfen
2016-04-18 14:55
@waken:你的意思是:$oss = new OSS(true) 改成 $oss = new OSS() ? 还是报同样的错
JohnLui
2016-04-18 15:15
@kailuo99:这个问题已经有了解决方案:https://github.com/johnlui/AliyunOSS/issues/9
Panfen
2016-04-18 15:18
@JohnLui:感谢您的及时回复,出现一个新的问题:OSSException in OSSExceptionFactory.php line 16:
AccessDenied,希望您能继续解答一下,form a laravel新手
lee
2016-03-17 17:26
libs目录下的guzzle ,有composer包,为什么作为自己的项目文件加入到项目中呢?
JohnLui
2016-03-17 17:28
@lee:SDK 需要的是绝对可用,版本更新就相当于依赖了别人,别人的错误会弄死自己。
acmagic
2016-01-29 16:35
我申请了一个pull request,麻烦reivew一下。多谢

发表评论:

© 2011-2017 岁寒  |  Powered by Emlog