为什么PUT不能像S3上的AWS PHP所宣传的那样工作


Why does PUT not work as advertised with AWS PHP on S3

我已经尝试了许多不同的方法,下面是本网站和其他来源的示例,但我遇到了困难。经过一个多月的每天尝试不同的东西,我还是没能做到这一点,我使用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类型通常不缩写。