我正在尝试使用带有 PUT 方法的预签名 URL 将文件从浏览器(Chrome 版本 41.0)上传到 S3。我在我的服务器上正确生成了预签名的 URL,因为它可以从 CURL 正常工作:
curl -X PUT "Content-Type:" --data "junk" "https://mypresignedurl"
我现在正在尝试使用 jQuery 从浏览器上传:
$.ajax({
url: "https://mypresignedurl",
method: 'PUT', // I've also tried type: 'PUT'
data: "junk",
})
这被 AWS 使用 SignatureDoesNotMatch 代码拒绝。错误指定:
<StringToSign>GET 1427216999 /mybucket/myfile</StringToSign>
但我没有使用 GET - 我使用的是 PUT。如果我检查 Chrome 的网络选项卡,它会正确地将请求列为 PUT。那么为什么 AWS 将浏览器 PUT 请求解释为 GET 并拒绝它们呢?
(这似乎与 CORS 无关。我已经在我的存储桶上设置了 CORS,然后使用 -H "Origin: http://elsewhere.com " 从 CURL 进行测试。我也尝试过传递 "type" “方法”。我尝试过使用 POST 而不是 PUT——即使如此,AWS 仍然将 StringToSign 列为 GET。我尝试了各种 contentTypes。FWIW,我的 presignedURL 上传逻辑在 WPF 应用程序中的 .NET 上都可以正常工作。 )