kfirba/directo

用于生成签名以便直接上传到Amazon S3的库

v0.2 2018-03-16 15:30 UTC

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() 方法返回一个包含以下键的数组

  1. policy - 策略的 base64 编码字符串。
  2. signature - 上文所述策略的签名。

选项

可用的选项有

例如

$directo = new Directo("bucket", "region", "key", "secret", [
    'acl' => 'private',
    'max_file_size' => 10,
    'additional_inputs' => [
        'Content-Disposition' => 'attachment'
    ]
]);

可用方法

点赞 👍

感谢 Edd Turtle优秀文章。该软件包的目的是使签名生成过程更具模块化,因此提供更多功能,并为 Laravel 用户创建桥梁。

许可证

Directo 是开源软件,许可协议为 MIT 许可证