如果您问“ 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树:
S3由存储区组成,这些存储区中包含许多目录和文件。 由于我曾经将AWS用作CDN,所以我的WordPress树仍然保留在旧存储桶中。 您也可以浏览存储桶 :
当我遍历对象树时,这是我的存储桶内容的更深层视图:
用S3编程
同样,我将在GitHub的hello树上构建示例代码(请参阅此页面上的链接。)它是从Yii2 basic派生的。
获取访问密钥
如果您还没有AWS S3 API的访问密钥,则需要它们。 如果没有,您可以通过浏览到“ 安全凭据”并创建一个新的对来获取它们:
为了进行代码演示,您需要使用其他安全密钥和代码将它们放置在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 +教程中使用过其代码:
这些天孩子们很快开始学习编程,这是否令人惊讶?
这是使用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时的结果 :
上载档案
要上传文件,您需要指定本地路径和远程目标密钥。 这是要上传的控制器代码:
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
在我上面的代码中:
反过来,浏览到上面的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的基础知识有所帮助。
如果您喜欢基于云的对象和文件存储的概念,但又想找到其他提供商,请查看Amazon AWS的替代方案 。 由于文章中提到的许多原因,我已经逐渐远离AWS。 我的下一个任务之一是将仍部分使用的S3对象迁移到我自己的服务器上,可以使用KeyCDN进行镜像。
在继续研究框架的不同方面时,请观看我们的《 使用Yii2编程》系列中即将发布的教程。 您可能还需要查看我们的“ 使用PHP构建启动”系列 ,该系列在构建实际应用程序时使用了Yii2的高级模板。 启动系列中的Meeting Planner应用程序现在可以使用了,并且都在Yii中内置。
如果您想知道下一个Yii2教程何时到达, 请在Twitter上关注我@reifman或查看我的讲师页面 。
相关链接
- Amazon Simple Storage Service文档
- Amazon AWS的替代产品(Envato Tuts +)
- Yii2开发者交流 ,我的Yii2资源网站
- 上传文件-Yii 2.0权威指南
翻译自: https://code.tutsplus.com/tutorials/programming-with-yii2-using-amazon-s3--cms-26347