kfirba / directo
用于生成签名以便直接上传到Amazon S3的库
Requires
- php: >=5.5.0
Requires (Dev)
- php: >=7.1.0
- mockery/mockery: ^0.9.5
- phpunit/phpunit: ~7.0
This package is auto-updated.
Last update: 2024-09-17 16:45:27 UTC
README
一个用于生成AWS Signature V4和补充表单输入的库,以便直接上传到Amazon S3。还包括Laravel的桥接器。
安装
$ composer require kfirba/directo
先决条件 - CORS & Bucket Policy
为了使上传成功,并且不被Amazon S3拒绝,我们需要配置CORS选项和bucket策略。
要更新CORS和bucket策略,登录您的AWS账户并转到S3。现在选择您的bucket,点击右上角的属性。点击权限。
要更新CORS配置,点击编辑CORS配置按钮。我推荐以下CORS配置
<?xml version="1.0" encoding="UTF-8"?> <CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <CORSRule> <AllowedOrigin>*</AllowedOrigin> <AllowedMethod>GET</AllowedMethod> <AllowedMethod>POST</AllowedMethod> <AllowedMethod>PUT</AllowedMethod> <MaxAgeSeconds>3000</MaxAgeSeconds> <AllowedHeader>*</AllowedHeader> </CORSRule> </CORSConfiguration>
要更新bucket策略,点击编辑bucket策略按钮。我推荐以下bucket策略
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": [ "s3:PutObject", "s3:PutObjectAcl" ], "Resource": "arn:aws:s3:::BUCKET_NAME/*" } ] }
别忘了将BUCKET_NAME
更改为您的bucket名称。
注意:如果您不打算上传任何其他ACL(除了private
)的文件,您可能想省略"s3:PutObjectAcl"
。
Laravel用户
如果您是Laravel用户,这个包包含一个为您准备的桥接器。
更新您的app.php
providers
数组并添加
Kfirba\Directo\Support\DirectoServiceProvider::class,
同时,更新您的aliases
数组并添加
'Directo' => Kfirba\Directo\Support\Facades\Directo::class,
如果您需要更改一些默认设置,您可以选择发布directo.php
配置以使更改在每次尝试生成签名时全局生效,或者使用Directo提供的便捷setter。
$ php artisan vendor:publish --tag=directo
现在您应该在config/
目录中找到一个包含所有默认选项的directo.php
文件。
// You can also change the options on-the-fly Directo::setOptions(['acl' => 'private'])->inputsAsArray();
即时更改非常有用,特别是当您可能在文档中有多于一个表单,其中一个可能需要与另一个不同的选项时。例如,一个用于上传一些私有度量数据的表单,您会想将acl
设置为private
,而一个用于上传个人照片的表单,您会想将acl
至少设置为public-read
。
该包读取在config/filesystems.php
中定义的S3配置,位于disks.s3
数组下。要更改配置,您可以在.env
文件中更改以下键
S3_KEY=myS3Key
S3_SECRET=myS3Secret
S3_REGION=eu-central-1
S3_BUCKET=bucket
Laravel然后读取这些环境变量,并在filesystems.disks.s3
中设置配置,这是Directo使用的。
用法
use Kfirba\Directo\Directo; require_once __DIR__ . "/vendor/autoload.php"; $directo = new Directo('bucket', 'region', 'key', 'secret', $options = []);
然后,使用我们刚刚创建的对象,我们可以生成表单的URL和所有需要的隐藏输入。
<form action="<?php echo $directo->formUrl()?>" method="post" enctype="multipart/form-data"> <?php echo $directo->inputsAsHtml() ?> <input type="file" name="file"> </form>
Laravel用户用法
如果您使用laravel,您可以使用Directo
外观。您还可以在任何自动解析的类中(例如任何Controller
)类型提示Directo
类,它将自动解析。
// Facade: Directo::formUrl(); Directo::inputsAsHtml(); // Type-hinted // SomeController.php: use Kfirba\Directo\Directo; // ... public function index(Directo $directo) { dd($directo->signature()); }
签名策略
有时,当使用文件上传插件,如FineUploader时,插件会将策略发送到服务器进行签名。一旦策略被签名,插件就会将策略和签名提交到AWS作为认证密钥。
Directo还提供了对给定策略进行签名的能力。策略可以是有效的JSON编码策略或base64编码策略(解码后为有效的JSON编码策略)。
如果您已经有一个Directo
对象,您可以直接调用sign()
方法
$directo->sign($policy); // => // ['policy' => 'base64-encoded policy...', 'signature => 'the signature...']
如果您没有Directo
对象,您可以创建一个新的对象或使用底层的Signature
对象
$signature = new Signature($secret, $region, $policy); $signature->sign($policy); // => // ['policy' => 'base64-encoded policy...', 'signature => 'the signature...']
Signature
对象生成 SigningKey
所需的参数是必需的。该 Signature
对象将解析给定的策略,并提取 SigningKey
所需的任何其他参数。
如果您是 Laravel 用户,您可以在任何地方使用 Directo
门面。
Directo::sign($policy); // => // ['policy' => 'base64-encoded policy...', 'signature => 'the signature...']
sign()
方法返回一个包含以下键的数组
policy
- 策略的 base64 编码字符串。signature
- 上文所述策略的签名。
选项
可用的选项有
例如
$directo = new Directo("bucket", "region", "key", "secret", [ 'acl' => 'private', 'max_file_size' => 10, 'additional_inputs' => [ 'Content-Disposition' => 'attachment' ] ]);
可用方法
点赞 👍
感谢 Edd Turtle 的 优秀文章。该软件包的目的是使签名生成过程更具模块化,因此提供更多功能,并为 Laravel 用户创建桥梁。
许可证
Directo 是开源软件,许可协议为 MIT 许可证。