如何在将图像上传到s3存储桶后从aws s3存储桶访问文件。当我得到图像时,显示访问被拒绝错误。
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>xxxxx</RequestId>
<HostId>xxxxx</HostId>
</Error>
Controller Code is
$sharedConfig = [
'region' => Config::get('filesystems.disks.s3.region'),
'version' => 'latest',
"Effect" => "Allow",
'credentials' => [
'key' => 'xxxx',
'secret' => 'xxxx'
]
];
$sdk = new \Aws\Sdk($sharedConfig);
$s3 = $sdk->createS3();
$res = $s3->putObject([
'Key' => $fileName, // This will overwrite any other files with same name
'SourceFile' => $filePath,
'Bucket' => 'bolttupload'
]);
Storage::copy($res['ObjectURL'],$destinationPath.$fileName);
echo $res['ObjectURL'];die;
答案 0 :(得分:2)
默认情况下,Amazon S3中的对象是私有的。您可以通过多种方式授予对象访问权限:
您用于访问对象的URL不会将您识别为授权用户。你没有Bucket政策。你的对象不公开。因此,您正确接收拒绝访问的消息。
要使其可访问,您必须根据上面的列表确定访问范围。如果您希望对象完全公开,请在上传时在对象上设置该选项:
$result = $client->putObject([
'ACL' => 'private|public-read|public-read-write|authenticated-read|aws-exec-read|bucket-owner-read|bucket-owner-full-control',
...
如果您想要整个存储桶或目录公开,请使用Bucket Policy。
如果您只想某些用户来访问它,请针对IAM用户或IAM组添加策略,然后使用标识用户的凭据访问该对象。
如果您希望应用在运行时确定谁应该访问该对象,请使用pre-signed URL。