使用“AWS SDK for PHP v3”将处理上传/下载到 S3
你好。
我是Mandai,负责Wild 开发团队。
如果你google一下,可以找到很多关于“AWS SDK for PHP”的内容,但是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 创建。
管理公共权限
检查是否每个人都可以读取它的一个示例是当您将静态文件放在站点上时。
对于您计划存储包含个人信息或重要 Excel 工作表的 PDF 的存储桶,请勿选中公共访问选项。
稍后您将看到,生成限时 URL 时,不需要设置公共访问权限,因此不必担心并继续。
这样就完成了S3存储桶的创建。
IAM 设置
从PHP访问时,需要将访问密钥和秘密密钥写入源代码配置文件中。
设置一个可以执行任何操作的访问密钥是一个坏主意,因此创建一个只能访问您这次设置的 S3 存储桶的用户,并使用该用户对 S3 执行操作。
首先,打开 IAM 用户创建屏幕并输入以下内容。
在下一步中,您将设置访问权限,但现在,无需设置任何内容即可进入确认屏幕。
将出现警告“此用户没有访问权限”,但忽略它并按“创建用户”按钮完成创建。
包含访问信息的 CSV 文件将通过电子邮件发送。或者,您可以使用屏幕上的下载按钮下载 CSV 文件并将其放在手边。
接下来,从用户列表中单击您刚刚创建的用户名以显示概述页面。
从“添加内联策略”中设置策略。
- 选择“Amazon S3”作为AWS服务
- 该操作包括 GetObject
- 输入 S3 存储桶 ARN,并在 Amazon 资源名称后附加“/*”。
- 如果您注册了“添加声明”按钮,则会在下面添加该声明。
对“PutObject”重复上述步骤并添加两条语句即可得到下图。
完成后,按“下一步”按钮转到确认屏幕。
为策略指定一个易于理解的名称并检查该策略(可能没问题,但请检查 ARN)。
单击“验证策略”以确认该策略有效。 ”出现,单击“应用策略”即可完成。
PHP准备
我们终于准备好编写 PHP 代码了,但我们需要做的最后一件事是安装适用于 PHP 的 AWS 开发工具包。
这次我从作曲家安装它,所以我将发布其步骤。
如果您有干净的环境,只需正常运行安装即可完成。
作曲家安装 aws/aws-sdk-php
如果您所在的环境已经通过composer完成了各种设置,那么有一个名为require的子命令,因此请使用它而不是修改composer.json。
作曲家需要 aws/aws-sdk-php
最新的适用于 PHP 的 AWS 开发工具包现已安装。
上传处理(本地→S3)
要从 PHP 操作 S3,请使用 S3Client 类。
# 从 S3Client 类创建客户端对象的模式 $s3client = new Aws\S3\S3Client([ 'credentials' => [ 'key' => 'your access key', 'secret' => 'your access Secret', ] , 'region' => 'ap-northeast-1', 'version' => 'latest', ]); # 从 S3Client 类的 factory() 方法创建客户端对象的模式 $s3client = S3Client:: factory([ 'credentials' => [ 'key' => '您的访问密钥', 'secret' => '您的访问密钥', ], 'region' => 'ap-northeast-1', 'version' = > '最新',]);
创建客户端对象有两种方法,两者的处理方式相同。
接下来是主要的上传过程。
使用 putObject() 方法。
$result = $s3client->putObject([ 'Bucket' => '您的存储桶名称', 'Key' => '文件密钥', 'SourceFile' => '/path/to/file', 'ContentType' => mime_content_type('/path/to/file'), ]);
如果上传成功,Aws\Result 类将在 $result 中返回。
其中包含有关您创建的 S3 对象的信息。
下载处理(S3→本地)
现在,我想尝试下载。
首先,创建一个 S3 客户端。
$s3client = new Aws\S3\S3Client([ 'credentials' => [ 'key' => '您的访问密钥', 'secret' => '您的访问密钥', ], 'region' => 'ap-northeast -1', '版本' => '最新', ]);
之后,正如您可能已经猜到的,我们使用 getObject() 方法检索文件。
$result = $s3client->getObject([ 'Bucket' => '您的存储桶名称', 'Key' => '存储桶密钥', ]);
如果下载成功,Aws\Result 类将在 $result 中返回。
过期URL的生成(expired url)
S3 允许您创建包含下载设置的 URL。
此功能允许您下载重要文件而不将其公开。
这是ChatWork中也使用的功能,上传到聊天组的文件是使用这种机制下载的。
这个实现也非常简单,虽然步骤略有不同,但是都是通过S3client以相同的方式完成的。
$cmd = $s3client->getCommand('GetObject', [ 'Bucket' => \Config::get('file.s3.bucket'), 'Key' => $file->path, $result = $s3client->createPresignedRequest($cmd, '+30 秒');
getCommand() 方法将进程 getObject() 的行为转换为命令并将其传递给 createPresignedRequest() 方法。
createPresignedRequest() 方法的第二个参数可以设置为三种类型:Datetime 类、时间戳和可由 strtotime() 函数解释的字符串。
另外,过期日期不能设置超过一周,最长过期日期为一周。
如果您访问已过期的链接,则会显示如下所示的屏幕,并且您将无法再访问该对象。
概括
AWS SDK for PHP易于安装,并且具有易于使用的类系统,但根据版本的不同,必然存在差异,例如缺少方法或不同的参数,因此希望本文对您有所帮助发展。 。
就是这样。