使用“AWS SDK for PHP v3”将处理上传/下载到 S3

你好。
我是Mandai,负责Wild 开发团队。

你可以通过谷歌搜索找到很多关于“AWS SDK for PHP”的信息,但其中仍然有很多文章是关于v2版本的,而v2版本的命令行系统已经发生了显著变化,所以即使你完全照搬原文,也无法正常工作。(说的就是我!)

这次,我们将为您提供使用“AWS SDK for PHP v3”上传和下载到 S3 的示例。

菜单

 

AWS 设置

首先,在开始编写代码之前,我们需要配置 AWS 端。
我们将创建一个 S3 存储桶,并可根据需要出于安全考虑配置一个专用的 IAM 帐户。

 

创建 S3 存储桶

S3页面上,点击“创建存储桶”按钮开始创建存储桶。

 

姓名和地区

 

存储桶名称

屏幕上还会显示存储桶名称,并提示“输入符合 DNS 规范的存储桶名称”。

DNS 合规性是指

  • 仅由字母数字字符、连字符和句点组成(不能使用下划线)
  • 字符数必须介于 3 到 63 之间。
  • 不以连字符或句点结尾
  • 连字符和句点不能相邻出现('.-', '-.')
  • 不包含连续的点号('..', '...')
  • 第一个字符必须是字母数字字符

大概就是这样。

如果使用点号分隔字符,在使用子域名格式进行 SSL 通信时,会出现 SSL 证书警告。
最好尽可能避免使用点号。

 

地区

在“区域”选项中,选择您希望存储数据的区域。
如果您的服务面向日本,最好选择“ap-northeast-1”(东京)。

 

从现有存储桶复制配置

如果要使用与其他存储桶相同的设置,请在此处选择。

 

设置属性

您可以通过设置名称和区域来创建存储桶,但您还可以通过启用访问控制、版本控制和日志记录等功能来更智能地使用 S3。

 

版本控制

请确保上传的文件已添加版本号。

 

日志记录

此设置会将访问历史记录输出到日志中。
该功能本身免费使用,但由于日志文件存储在 S3 中,因此会产生 S3 存储费用。
此外,如果您查看日志,则会产生数据传输费用。

 

标签

您可以设置与账单信息关联的标签。
使用此功能,您可以为同一账户中设置的 S3 对象使用费创建单独的账单。

 

设置权限

您可以设置谁可以访问它以及它的可用范围。

 

管理用户

设置可以操作存储桶的用户。
此用户与您的 AWS 账户关联,必须在 IAM 中创建。

 

管理公共访问权限

如果您要在网站上存储静态文件,则应勾选“所有人可读”。
如果您计划将包含个人信息的 PDF 文件或重要的 Excel 表格存储在存储桶中,则请勿勾选“公开访问”选项。

我们稍后会看到,如果您生成的是有时限的 URL,则无需设置公共访问权限,所以不用担心。

至此,S3 存储桶创建完成。

 

IAM 配置

要通过 PHP 访问,您需要在源代码配置文件中写入访问密钥和私钥。
设置一个可以执行任何操作的访问密钥并不明智,因此请创建一个只能访问您此次设置的 S3 存储桶的用户,并使用该用户对 S3 执行操作。

首先,打开 IAM 用户创建界面,然后输入以下内容:

您将在下一步设置访问权限,但现在,请先跳过任何设置,直接进入确认页面。
此时会显示一条警告信息“此用户没有访问权限”,请忽略此信息,然后点击“创建用户”按钮完成创建。

包含访问信息的 CSV 文件将通过电子邮件发送给您。您也可以点击屏幕上的下载按钮下载 CSV 文件并保存。

接下来,在用户列表中,单击您刚刚创建的用户名,以显示概览页面。

首先点击“添加内联策略”来设置策略。

  • 选择“Amazon S3”作为 AWS 服务。
  • 操作包括获取对象
  • 在 Amazon 资源名称字段中输入 S3 存储桶 ARN,后跟“/*”。
  • 注册“添加报表”按钮后,它将被添加到下方。

对“PutObject”重复上述步骤,并添加下图所示的两条语句。

完成后,点击“下一步”按钮进入确认页面。

给该策略起一个易于理解的名称,并检查该策略(这应该没问题,但您应该检查 ARN)。

点击“验证策略”,当您看到“此策略有效”的消息时,点击“应用策略”完成该过程。

 

PHP 准备

现在我们终于可以编写一些 PHP 代码了,但是我们需要安装“AWS SDK for PHP”。

这次我使用 Composer 进行安装,下面我将向大家展示安装步骤。

如果你使用的是全新环境,只需运行安装命令即可。

composer install aws/aws-sdk-php

 

如果您所处的环境中已经通过 composer 完成了各种设置,则无需修改 composer.json,而是使用名为 require 的子命令。

composer require aws/aws-sdk-php

 

您现在已安装最新的适用于 PHP 的 AWS SDK。

 

上传过程(本地 → S3)

要从 PHP 访问 S3,请使用 S3Client 类。

# 使用 S3Client 类创建客户端对象的模式 $s3client = new Aws\S3\S3Client([ 'credentials' => [ 'key' => '您的访问密钥', 'secret' => '您的访问密钥', ], 'region' => 'ap-northeast-1', 'version' => 'latest', ]); # 使用 S3Client 类的 factory() 方法创建客户端对象的模式 $s3client = S3Client::factory([ 'credentials' => [ 'key' => '您的访问密钥', 'secret' => '您的访问密钥', ], 'region' => 'ap-northeast-1', 'version' => 'latest', ]);

 

创建客户端对象有两种方法,这两种方法的处理方式相同。

接下来,我们将执行实际的上传过程。
我们将使用 putObject() 方法。

$result = $s3client->putObject([ 'Bucket' => '您的存储桶名称', 'Key' => '文件键', 'SourceFile' => '/path/to/file', 'ContentType' => mime_content_type('/path/to/file'), ]);

 

如果上传成功,$result 将返回一个 Aws\Result 类,
其中包含有关您创建的 S3 对象的信息。

 

下载过程(S3 → 本地)

现在,我们试试下载它。

首先,创建一个S3客户端。

$s3client = new Aws\S3\S3Client([ 'credentials' => [ 'key' => '您的访问密钥', 'secret' => '您的访问密钥', ], 'region' => 'ap-northeast-1', 'version' => 'latest', ]);

 

然后,正如你可能猜到的那样,我们使用 getObject() 方法获取文件。

$result = $s3client->getObject([ 'Bucket' => '您的存储桶名称', 'Key' => '存储桶键', ]);

 

如果下载成功,则 $result 中将返回一个 Aws\Result 类。

 

生成过期网址

S3 允许您创建带有下载设置的 URL,
这样您就可以下载重要文件而无需将其公开。

ChatWork 也使用了这项功能,可以通过这种机制下载上传到聊天群组的文件。

这个实现方式也很简单,虽然步骤略有不同,但都是通过 S3client 以相同的方式完成的。

$cmd = $s3client->getCommand('GetObject', [ 'Bucket' => \Config::get('file.s3.bucket'), 'Key' => $file->path, ]); $result = $s3client->createPresignedRequest($cmd, '+30 seconds');

 

getCommand() 方法将 getObject() 过程的行为转换为命令,并将其传递给 createPresignedRequest() 方法。

createPresignedRequest() 方法的第二个参数可以设置为三种类型:Datetime 类、时间戳或可由 strtotime() 函数解释的字符串。

此外,到期日期不能设置为超过一周,最长为一周。

如果您访问的链接已过期,则会显示以下屏幕,您将无法访问该对象。

 

概括

AWS SDK for PHP 安装简便,类系统易于使用,但不同版本之间难免存在差异,例如缺少方法或参数不同,因此我希望本文能对您的开发有所帮助。

就是这样。

如果您觉得这篇文章有帮助,请点赞!
2
加载中...
2 票,平均:1.00 / 12
8,178
X Facebook 哈特纳书签 口袋

写这篇文章的人

关于作者

万代洋一

我的主要工作是为社交游戏开发 Web API,但我也很幸运能够做很多其他工作,包括营销。
此外,我在 Beyond 中的肖像权被视为 CC0。