Amazon S3 直接上传:CORS 错误
Amazon S3 direct upload: CORS error
由于 CORS 阻塞系统,我无法在我的 S3 存储桶上直接上传 (javascript XHR)。
我正在使用 PHP 生成直接上传 link,带有上传策略和 S3 签名:
{"key": "501/source/${filename}", "AWSAccessKeyId": "AKIAIIG**********", "acl": "private","policy": "ey JleHBpcmF0aW***************", "signature": "j2UnJRfj+uC+FazEF+wPnuJpdcs=", "success_action_status": "201"}
但是当我尝试将文件上传到生成的 link 时,我从 Firefox 收到以下错误:
Request Blocked: The Same Origin Policy disallows reading the remote
resource at https://my.bucket.s3.amazonaws.com. This can be fixed by
moving the resource to the same domain or enabling 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>
我还应该做什么?
这是我用来生成策略和 S3 签名的 PHP 代码:
$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()
脚本中使用这个参数数组直接上传到 Amazon S3(XHR 请求)。
感谢您的帮助,
菲利普·S.
如果有人被卡住...切勿使用点“.”在您的存储桶名称中。
作为新的子域,它导致了一些 SSL 证书问题。
例如:您将存储桶命名为 "my.bucket",那么它将被理解为 "bucket" 的 "my" 子域。
只需使用“-”或“_”代替点。
由于 CORS 阻塞系统,我无法在我的 S3 存储桶上直接上传 (javascript XHR)。 我正在使用 PHP 生成直接上传 link,带有上传策略和 S3 签名:
{"key": "501/source/${filename}", "AWSAccessKeyId": "AKIAIIG**********", "acl": "private","policy": "ey JleHBpcmF0aW***************", "signature": "j2UnJRfj+uC+FazEF+wPnuJpdcs=", "success_action_status": "201"}
但是当我尝试将文件上传到生成的 link 时,我从 Firefox 收到以下错误:
Request Blocked: The Same Origin Policy disallows reading the remote resource at https://my.bucket.s3.amazonaws.com. This can be fixed by moving the resource to the same domain or enabling 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>
我还应该做什么?
这是我用来生成策略和 S3 签名的 PHP 代码:
$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()
脚本中使用这个参数数组直接上传到 Amazon S3(XHR 请求)。
感谢您的帮助, 菲利普·S.
如果有人被卡住...切勿使用点“.”在您的存储桶名称中。 作为新的子域,它导致了一些 SSL 证书问题。
例如:您将存储桶命名为 "my.bucket",那么它将被理解为 "bucket" 的 "my" 子域。
只需使用“-”或“_”代替点。