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

Javascript 为什么PUT不能像在S3上用AWS PHP宣传的那样工作,javascript,php,amazon-s3,pre-signed-url,Javascript,Php,Amazon S3,Pre Signed Url,我已经尝试了许多不同的方法,从这个网站和其他来源的例子,但我击中了砖墙。在一个多月的日常尝试之后,我无法让它正常工作,因此我使用最新版本的AWS SDK for AWS-php-SDK-2.7.1将它缩小为以下内容。你觉得这样行吗?我试图做的是允许用户使用javascript编辑网页,捕获Div中的标记,并使用AmazonS3上的签名URL将其放入bucket中。我收到一个错误,我的签名方法不正确。我是否错误地认为SDK应该为我做这项工作,还是我做错了什么。我的密钥和密码在使用JAVA和PUT时

我已经尝试了许多不同的方法,从这个网站和其他来源的例子,但我击中了砖墙。在一个多月的日常尝试之后,我无法让它正常工作,因此我使用最新版本的AWS SDK for AWS-php-SDK-2.7.1将它缩小为以下内容。你觉得这样行吗?我试图做的是允许用户使用javascript编辑网页,捕获Div中的标记,并使用AmazonS3上的签名URL将其放入bucket中。我收到一个错误,我的签名方法不正确。我是否错误地认为SDK应该为我做这项工作,还是我做错了什么。我的密钥和密码在使用JAVA和PUT时工作正常,但我需要一个在客户端工作的解决方案。没有SDK的其他方案使用了其他方式来签署URL,但我也无法让这些在这里工作…我真的需要一些帮助。多谢各位

这就是我现在所在的地方

我的Cors在桶上: ////////////////////////////////////////////////////////////

<?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网站上所指出的,并非所有浏览器都支持PUT和DELETE请求。

来自浏览器的请求包含一个内容类型头,该头不在预签名的URL中,导致签名无效。您需要在签名中包含该信息,就像您直接在PHP中执行PUT操作一样。我找不到与您用于执行该请求的语法相匹配的文档,但指出以下应该可以工作:

$command = $client->getCommand("PutObject", array(
    'Bucket'      => ...,
    'Key'         => ...,
    'ContentType' => 'txt/html; charset=utf-8',
));

$url = $command->createPresignedUrl('+10 minutes');

另外,您当前使用的内容类型无效。这不会阻止上载工作,但会使其无法在浏览器中正确显示。您需要的是text/html,而不是txt/html;MIME类型通常不缩写。

我在最新版本的Firefox和Safari中都尝试过它。。。应该在工作。。。HTMLVersion4和XHTML1之前的HTML表单仅支持GET和POST as HTTP请求方法。但是,XMLHttpRequest的实现支持GET、POST、PUT和DELETE,即所有主要web浏览器(如Firefox、Opera)中的AJAX调用。我以前试过这个表格。。。每当我在收到致命错误之前使用createPredisgnedUrl“+10分钟”而没有$request时:调用未定义的方法Guzzle\Service\Command\OperationCommand::createPresignedUrl。。。我按照你的建议又试了一次,但没有成功。我还使用:$signedUrl=$client->createPresignedUrl$command,“+10分钟”进行了尝试,结果得到:警告:缺少必需的参数,并且出现致命错误:调用未定义的方法Guzzle\Service\command\OperationCommand::getqueryary是否确实使用了AWS SDK的当前版本?是的,与上周一样最新。。。v2.7.1。我刚刚检查了v2.7.2是否已退出。我将尝试一下。我已经安装了v2.7.2,但仍然没有乐趣。我是否缺少一个依赖关系?如上所述,我只使用Aws\Common\Aws、Aws\Common\Region和Aws\S3客户端。。。