我已经尝试了许多不同的方法,下面是本网站和其他来源的示例,但我遇到了困难。经过一个多月的每天尝试不同的东西,我还是没能做到这一点,我使用AWS-php-SDK-2.7.1的最新版本的AWS SDK将其缩小到以下内容。你认为它会起作用吗?我试图做的是允许用户使用javascript编辑网页,在Div中捕获标记,并使用AmazonS3上的签名URL将其放入bucket。我收到一个错误,我的签名方法不正确。我是错误地认为SDK应该为我做这项工作,还是我做错了什么。我的密钥和密码使用JAVA和PUT运行良好,但我需要一个在客户端工作的解决方案。其他没有SDK的方案使用了其他方式来签名URL,但我也无法在这里使用这些……我真的需要一些帮助。非常感谢。
这就是我目前的处境。
我的珊瑚在水桶上:////////////////////////////////////////////////////////////
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedOrigin>*:8443</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
如jQuery网站上所述(http://api.jquery.com/jquery.ajax/),并不是所有浏览器都支持"PUT"answers"DELETE"请求。
来自浏览器的请求包含预签名URL中不存在的Content-Type
标头,导致签名无效。您需要在签名中包含这些信息,就像您直接在PHP中执行PUT操作一样。我找不到与您用于执行该请求的语法匹配的文档,但AWS SDK的Github问题表明以下内容应该有效:
$command = $client->getCommand("PutObject", array(
'Bucket' => ...,
'Key' => ...,
'ContentType' => 'txt/html; charset=utf-8',
));
$url = $command->createPresignedUrl('+10 minutes');
顺便说一句,您当前使用的内容类型无效。(这不会阻止上传工作,但会使其无法在浏览器中正确显示。)您需要text/html
,而不是txt/html
;MIME类型通常不缩写。