Amazon S3直接上传:CORS错误

时间:2015-09-29 08:29:54

标签: amazon-s3 cors jqxhr

由于CORS阻止系统,我无法在我的S3存储桶上直接上传(javascript XHR)。 我正在使用PHP生成直接上传链接,具有上传策略和S3签名:

{"key": "501/source/${filename}", "AWSAccessKeyId": "AKIAIIG**********", "acl": "private","policy": "ey JleHBpcmF0aW***************", "signature": "j2UnJRfj+uC+FazEF+wPnuJpdcs=", "success_action_status": "201"}

但是当我尝试将文件上传到生成的链接时,我从Firefox中收到以下错误:

  

请求已阻止:同源策略禁止读取远程   资源https://my.bucket.s3.amazonaws.com。这可以修复   将资源移动到同一域或启用CORS。

我的存储桶已正确配置CORS策略,允许来自任何地方的POST:

<?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>
        <AllowedMethod>DELETE</AllowedMethod>
        <AllowedMethod>HEAD</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

我还应该做些什么?

这是我用来生成策略的PHP代码。 S3签名:

$key = '42/source/';
$policy = json_encode(array(
    'expiration' => date('Y-m-d\TG:i:s\Z', strtotime('+6 hours')),
    'conditions' => array(
        array('bucket' => 'my.bucket'),
        array('acl' => 'private'),
        array('starts-with', '$key', $key),
        array('success_action_status' => '201')
    )
));
$policy = base64_encode($policy);
$signature = base64_encode(hash_hmac('sha1', $policy, 'G3wzaTNwnQC2mQB3****************', true));
return array(
    'key' => $key.'${filename}',
    'AWSAccessKeyId' => 'AKIAIIG**********',
    'acl' => 'private',
    'policy' => $policy,
    'signature' => $signature,
    'success_action_status' => '201'
);

然后我在我的JavaScript fileupload()脚本中使用这个params数组来上传到Amazon S3(XHR请求)。

感谢您的帮助, Philippe S。

1 个答案:

答案 0 :(得分:0)

如果有人被卡住......永远不要使用点“。”在你的桶名称中。 它导致一些SSL证书问题,作为一个新的子域。

例如:你将你的桶命名为“my.bucket”,然后它将被理解为“我的”“桶”子域。

只需使用“ - ”或“_”代替点。