将文件上传到s3时选项ERR_NAME_NOT_RESOLVED

时间:2016-06-14 17:36:54

标签: angularjs laravel amazon-web-services amazon-s3

我尝试使用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...

1 个答案:

答案 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”