使用签名URL上传到Amazon S3可以使用curl但不能在javascript中使用

Iva*_*nna 5 javascript curl file-upload amazon-s3 amazon-web-services

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

curl --upload-file test.jpg $SIGNED_URL
Run Code Online (Sandbox Code Playgroud)

然后上传工作正常(所以签名的网址没有问题).我也用curl将引用设置为各种各样的东西,它仍然有效,所以我认为也没有CORS问题.我正在尝试使用javascript上传文件blob,如下所示:

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

这总是返回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>
Run Code Online (Sandbox Code Playgroud)

所以签名似乎就是问题所在.同样,当我使用卷曲时(即使它在javascript中失败后),同样精确的URL也能正常工作.

Iva*_*nna 7

问题是卷曲没发送的'Content-Header'.无论您是否明确添加,Chrome都会发送此标头.要获得可以使用此标头的已签名网址,您需要将标头= {'Content-Type':type}传递给boto中的generate_url.