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