我尝试使用Angular和Laravel 5.1将图像上传到S3。
Angular首先向我的服务器应用程序询问预先签名的URL,然后继续使用签名请求上传文件。
签名返回时我收到以下OPTIONS错误,然后尝试使用它上传:
OPTIONS https://s3.us-standard.amazonaws.com/my.resources/dog-aromatherapy.jpg?x-a…Signature=b3ef83... net::ERR_NAME_NOT_RESOLVED
my.resources S3 Bucket 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>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Laravel:
public function signature(Request $request)
{
...get Request filename and filetype...
$s3Client = new S3Client([
'region' => 'us-standard',
'version' => 'latest'
]);
$options = [
'Bucket' => getenv('AWS_S3_BUCKET'),
'Key' => $file_name,
'Expires' => 60,
'ContentType' => $file_type,
'ACL' => 'public-read'
];
$cmd = $s3Client->getCommand('PutObject', $options);
$s_request = $s3Client->createPresignedRequest($cmd, '+20 minutes');
$pre_signedUrl = (string) $s_request->getUri();
return response()->json(
[
'signed_request' => $pre_signedUrl,
'url' => 'https://s3.amazonaws.com/' . getenv('AWS_S3_BUCKET') . '/' . $file_name
]
);
}
是什么给出了什么?我在正确的S3存储桶上有一个有效的CORS配置,并且我获得了一个看似预先签名的签名,然后允许文件上传......
单击OPTIONS错误,标题如下:
x-amz-acl:public-read
X-Amz-Content-Sha256:UNSIGNED-PAYLOAD
X-Amz-Algorithm:AWS4-HMAC-SHA256
X-Amz-Credential:AKIA/20160614/us-standard/s3/aws4_request
X-Amz-Date:20160614T172559Z
X-Amz-SignedHeaders:host
X-Amz-Expires:1200
X-Amz-Signature:b3ef836...
答案 0 :(得分:2)
错误出现在此标题行
中X-Amz-Credential:AKIA/20160614/us-standard/s3/aws4_request
将"us-standard"
更改为"us-east-1"
,它会起作用
Amazon S3将美国标准区域重命名为美国东部(弗吉尼亚北部)区域,以与AWS区域命名约定保持一致。
在此代码中
$cmd = $s3Client->getCommand('PutObject', $options);
将选项更改为“params”