使用签名 URL 上传到 Amazon S3 适用于curl,但不适用于 javascript

2024-01-03

我正在尝试使用 PUT 请求将文件上传到 Amazon S3。我使用 boto 生成签名网址。如果我做

curl --upload-file test.jpg $SIGNED_URL

然后上传工作正常(因此签名的网址不存在问题)。我还使用curl将引用设置为各种内容,它仍然有效,所以我认为也不存在CORS问题。我正在尝试使用 JavaScript 上传文件 blob,如下所示:

var xmlhttp = new XMLHttpRequest();    
xmlhttp.open("PUT", $SIGNED_URL);
xmlhttp.setRequestHeader('Content-Type', blob.type);
xmlhttp.send(blob);

这总是返回 403 Forbidden 错误。我发现在网上找到任何有关从 javascript 将数据放入 S3 的信息非常困难。我现在意识到 POST 表单数据更常见,但是有什么方法可以修改我正在做的事情以使其也可以工作吗?

编辑:我现在找到了错误的正文:

> <Error><Code>SignatureDoesNotMatch</Code> <Message>The request
> signature we calculated does not match the signature you provided.
> Check your key and signing method.</Message>

所以看来,签名是问题所在。同样,当我将它与curl一起使用时,相同的确切url可以工作(即使在javascript中失败之后)。


问题是curl 未发送的“内容标头”。无论您是否显式添加,Chrome 都会发送此标头。要获取适用于此标头的签名 URL,您需要将 headers={'Content-Type':type} 传递给 boto 中的generate_url。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用签名 URL 上传到 Amazon S3 适用于curl,但不适用于 javascript 的相关文章

随机推荐