使用Yii2编程:使用Amazon S3

最终产品图片
您将要创造的

如果您问“ Yii是什么?” 查阅我之前的教程 《 Yii框架简介》,该 教程 回顾了Yii的好处,并概述了2014年10月发布的Yii 2.0的新功能。

在本使用Yii2编程系列中 ,我指导读者使用PHP的Yii2框架。 在今天的教程中,我将向您介绍浏览和上传文件以及从Amazon的基于云的S3存储服务中下载文件的基础知识。 本质上,我已经创建了一个简单的存储模型和控制器作为示例,可以根据需要进行扩展。

提醒一下,我确实参与了下面的评论主题。 如果您有不同的方法,其他想法,或者想为以后的教程提出建议,我特别感兴趣。 如果您有任何问题或建议,请在下面发布。 您也可以直接通过Twitter @reifman与联系

什么是Amazon S3?

Amazon S3为对象和文件提供了易于使用的高级基于云的存储。 它提供了99.99%的可用性和99.999999999%的对象耐久性。

它提供了用于简单或高级使用的多种功能。 它通常用作Amazon CDN服务CloudFront的存储组件,但是它们是不同的,可以彼此独立使用。

您还可以使用S3随时间迁移文件以将其归档到Amazon Glacier中,以节省更多成本。

像大多数所有AWS一样,您可以通过API操作S3,而今天,我将引导您通过Yii浏览,上传和下载S3中的文件。

入门

要运行演示代码,您需要自己的Amazon AWS账户和访问密钥。 您可以从如下所示的AWS控制台浏览S3树:

Yii AWS S3-AWS控制台菜单

S3由存储区组成,这些存储区中包含许多目录和文件。 由于我曾经将AWS用作CDN,所以我的WordPress树仍然保留在旧存储桶中。 您也可以浏览存储桶

Yii AWS S3-铲斗

当我遍历对象树时,这是我的存储桶内容的更深层视图:

Yii AWS S3-对象文件夹和文件

用S3编程

同样,我将在GitHub的hello树上构建示例代码(请参阅此页面上的链接。)它是从Yii2 basic派生的。

获取访问密钥

如果您还没有AWS S3 API的访问密钥,则需要它们。 如果没有,您可以通过浏览到“ 安全凭据”并创建一个新的对来获取它们:

Yii AWS S3-安全凭证和访问密钥

为了进行代码演示,您需要使用其他安全密钥和代码将它们放置在hello.ini文件中:

$ more /var/secure/hello.ini 
mysql_host="localhost"
mysql_db="hello"
mysql_un="tom_mcfarlin"
mysql_pwd="is-never-gonna-give-up-rick-astley"
aws_s3_access = "AXXXXXXXXXXXXXXXXXXXXXXXXXXXA"
aws_s3_secret = "nXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXb"
aws_s3_region = "us-east-1"

安装Yii Extension for AWS

在本教程中,我们将使用Federico Motta的 Yii2 AWS扩展 。 他绝对是最年轻的Yii程序员,我曾在Envato Tuts +教程中使用过其代码:

Yii AWS S3-Github上针对Yii2的AWS开发工具包扩展

这些天孩子们很快开始学习编程,这是否令人惊讶?

这是使用composer的安装过程:

$ composer require fedemotta/yii2-aws-sdk
Using version ^2.0 for fedemotta/yii2-aws-sdk
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
  ...
  
  - Installing aws/aws-sdk-php (3.18.27)
    Downloading: 100%         

  - Installing fedemotta/yii2-aws-sdk (v2.0)
    Loading from cache

aws/aws-sdk-php suggests installing aws/aws-php-sns-message-validator (To validate incoming SNS notifications)
aws/aws-sdk-php suggests installing doctrine/cache (To use the DoctrineCacheAdapter)
Writing lock file
Generating autoload files

之后,我还安装了它建议的两个库,但没有为我的本地开发机器安装所有下一级别的建议:

$ composer require aws/aws-php-sns-message-validator
Using version ^1.1 for aws/aws-php-sns-message-validator
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing aws/aws-php-sns-message-validator (1.1.0)   
    Loading from cache

Writing lock file
Generating autoload files

$ composer require cache/doctrine-adapter
Using version ^0.5.0 for cache/doctrine-adapter
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing doctrine/cache (v1.6.0)                     
    Loading from cache

  - Installing psr/cache (1.0.0)
    Loading from cache

  - Installing cache/taggable-cache (0.4.0)
    Loading from cache

  - Installing psr/log (1.0.0)
    Loading from cache

  - Installing cache/adapter-common (0.3.2)
    Loading from cache

  - Installing cache/doctrine-adapter (0.5.0)
    Loading from cache

cache/doctrine-adapter suggests installing ext-apc (Allows for caching with Apc)
cache/doctrine-adapter suggests installing ext-memcache (Allows for caching with Memcache)
cache/doctrine-adapter suggests installing ext-memcached (Allows for caching with Memcached)
cache/doctrine-adapter suggests installing ext-redis (Allows for caching with Redis)
Writing lock file
Generating autoload files

我还在hello / config / web.php中注册了awssdk组件:

'components' => [
      'awssdk' => [
        'class' => 'fedemotta\awssdk\AwsSdk',
        'credentials' => [
          //you can use a different method to grant access
          'key' => $config['aws_s3_access'],
          'secret' => $config['aws_s3_secret'],
        ],
        'region' => $config['aws_s3_region'], //i.e.: 'us-east-1'
        'version' => 'latest', //i.e.: 'latest'
      ],

浏览我的S3目录

在今天的演示中,我使用操作方法创建了一个hello / controllers / StorageController.php来运行每个示例,例如http:// localhost:8888 / hello / storage / browse来浏览目录。

这些方法依次调用我使用自己的方法创建的Storage.php模型。

这是控制器代码:

public function actionBrowse()
    {
      $s = new Storage();
      $s->browse('jeff-reifman-wp',"manual");
    }

它要求存储模型到达“ S3ky”中的云并浏览手册目录。

每次实例化Storage.php模型时,它都会加载AWS开发工具包扩展并创建一个S3实例:

<?php
namespace app\models;
use Yii;
use yii\base\Model;

class Storage extends Model
{

  private $aws;
  private $s3;

   function __construct() {
     $this->aws = Yii::$app->awssdk->getAwsSdk();
     $this->s3 = $this->aws->createS3();
  }

在我的浏览示例中,我只是回显目录和文件,但是您可以根据需要自定义此代码:

public function browse($bucket='',$prefix='') {
    $result = $this->s3->listObjects(['Bucket' => $bucket,"Prefix" => $prefix])->toArray();
    foreach ($result as $r) {
      if (is_array($r)) {
        if (array_key_exists('statusCode',$r)) {
            echo 'Effective URL: '.$r['effectiveUri'].'<br />';
        } else {
          foreach ($r as $item) {
            echo $item['Key'].'<br />';
          }
        }
      } else {
          echo $r.'<br />';
        }
    }
  }

这是我浏览到http:// localhost:8888 / hello / storage / browse时的结果

Yii AWS S3-浏览S3对象列出目录和文件

上载档案

要上传文件,您需要指定本地路径和远程目标密钥。 这是要上传的控制器代码:

public function actionUpload() {
    $bucket = 'jeff-reifman-wp';
    $keyname = '/manual/upload.txt';
    $filepath ='/Users/Jeff/Sites/hello/upload.txt';
    $s = new Storage();
    $result = $s->upload($bucket,$keyname,$filepath);
    echo $result['ObjectURL'];
  }

这是存储模型方法:

public function upload($bucket,$keyname,$filepath) {
    $result = $this->s3->putObject(array(
    'Bucket'       => $bucket,
    'Key'          => $keyname,
    'SourceFile'   => $filepath,
    'ContentType'  => 'text/plain',
    'ACL'          => 'public-read',
    'StorageClass' => 'REDUCED_REDUNDANCY',
    'Metadata'     => array(
        'param1' => 'value 1',
        'param2' => 'value 2'
    )
));
return $result;

浏览到http:// localhost:8888 / hello / storage / upload会显示返回的URL,我可以从中查看上传的文件,因为我指定了public-read   在我上面的代码中:

Yii AWS S3-上传方法的结果-新文件的URL

反过来,浏览到上面的S3地址将显示上载文件的内容:

This is a test to upload to S3

下载档案

这是用于下载文件的控制器代码:

public function actionDownload() {
    $s = new Storage();
    $f = $s->download('jeff-reifman-wp','files/2013/01/i103-wedding-cover.jpg');
    //download the file
    header('Content-Type: ' . $f['ContentType']);
    echo $f['Body'];
  }

由于浏览器响应内容类型,因此它应该显示适当的图像,这是我在这里要求的。

注意:我正在从与名为Corporate Person的公司与女性结婚的经历中下载封面图像( 是的,它实际上是在发生 )。 这段婚姻没有长久的结局。

这是要下载的存储模型代码:

public function download($bucket='',$key ='') {
    //get the last object from s3
    //$object = end($result['Contents']);
    // $key = $object['Key'];
    $file = $this->s3->getObject([
        'Bucket' => $bucket,
        'Key' => $key,
    ]);
    return $file;
    // save it to disk
  }

这是文件流式传输到浏览器时所看到的-这是新娘通过向Corporate Person挥舞实际的结婚证来庆祝的事情(我在后台微笑,任务已完成)。

Yii AWS S3-带女性和结婚证的结婚场景

当然,您可以轻松地将结果存储在服务器上的文件中。 由你决定。 我鼓励您使用代码并根据需要对其进行自定义。

下一步是什么?

我希望这对您从Yii应用程序使用AWS S3的基础知识有所帮助。

如果您喜欢基于云的对象和文件存储的概念,但又想找到其他提供商,请查看Amazon AWS的替代方案 。 由于文章中提到的许多原因,我已经逐渐远离AWS。 我的下一个任务之一是将仍部分使用的S3对象迁移到我自己的服务器上,可以使用KeyCDN进行镜像。

在继续研究框架的不同方面时,请观看我们的《 使用Yii2编程》系列中即将发布的教程。 您可能还需要查看我们的“ 使用PHP构建启动”系列 ,该系列在构建实际应用程序时使用了Yii2的高级模板。 启动系列中的Meeting Planner应用程序现在可以使用了,并且都在Yii中内置。

如果您想知道下一个Yii2教程何时到达, 在Twitter上关注我@reifman查看我的讲师页面

相关链接

翻译自: https://code.tutsplus.com/tutorials/programming-with-yii2-using-amazon-s3--cms-26347

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值