jin*_*hun 5 storage amazon-s3 amazon-web-services laravel
RT。
这是我的s3的文件系统配置:
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_REGION'),
'bucket' => env('AWS_BUCKET'),
],
Run Code Online (Sandbox Code Playgroud)
这是我的composer.json:
"require": {
"laravel/framework": "5.1.*",
"barryvdh/laravel-ide-helper": "~2.0",
"predis/predis": "~1.0",
"guzzlehttp/guzzle": "~5.0",
"league/flysystem-aws-s3-v3": "~1.0",
"raven/raven": "0.12.*"
},
Run Code Online (Sandbox Code Playgroud)
这是我的s3的存储桶策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyUnEncryptedObjectUploads",
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::*****bucket_name*****/*",
"Condition": {
"StringNotEquals": {
"s3:x-amz-server-side-encryption": "AES256"
}
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
是的,我用作"s3:x-amz-server-side-encryption": "AES256"PutObject的条件,但我想使用像这样的代码:
Storage::disk('s3')->put('test.log','123');
Run Code Online (Sandbox Code Playgroud)
但是当我运行它时,我将得到如下响应:
[Aws\S3\Exception\S3Exception]
Error executing "HeadObject" on "https://s3-ap-northeast-1.amazonaws.com/****bucket_name****/test.log"; AWS HTTP error: Client error response [url]https://s3-ap-northeast-1.amazonaws.com/****bucket_name****/test.log [status code] 403 [reason phrase] Forbidden (client): 403 Forbidden (Request-ID: 39C30C8512E5ED16) -
[GuzzleHttp\Exception\ClientException]
Client error response [url] https://s3-ap-northeast-1.amazonaws.com/****bucket_name****/test.log [status code] 403 [reason phrase] Forbidden
Run Code Online (Sandbox Code Playgroud)
那么,我该怎么做呢?谢谢!
小智 6
(Laravel 5.3)如果您的存储桶策略要求对所有对象进行服务器端加密,而不是访问S3驱动程序并向其传递参数,则可以通过在配置中将其设置为选项来普遍启用S3 SSE:
config / filesystems.php
...
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_REGION'),
'bucket' => env('AWS_S3_BUCKET'),
'options' => [
'ServerSideEncryption' => 'AES256',
]
],
...
Run Code Online (Sandbox Code Playgroud)
通过在配置中设置ServerSideEncryption选项,我可以直接在“磁盘”上进行方法调用。
$s3 = Storage::disk('s3');
$s3->putFileAs($prefix, new File($path), $filename);
Run Code Online (Sandbox Code Playgroud)
小智 2
如果您检索 S3 驱动程序,您可以提供参数:
Storage::disk('s3')->getDriver()->put('filename', 'randomdata', ['ServerSideEncryption' => 'AES256']);
Run Code Online (Sandbox Code Playgroud)