使用预先签名的网址,从PUT到S3的400错误请求

时间:2019-07-16 13:34:53

标签: javascript amazon-s3 browser xmlhttprequest aws-sdk

我正在尝试将视频文件从JS上传到S3存储桶,但现在收到400错误请求。我确定我可以正确设置所有内容,但可以做些什么。

我在这样的服务器上生成一个URL:

const client = new S3({
    accessKeyId: 'id-ommited',
    secretAccessKey: 'key-ommited',
    region: 'eu-west-2',
    useAccelerateEndpoint: true
});
const url = client.getSignedUrl('putObject', {
    Bucket:  'screen-capture-uploads',
    Key:     'video.webm',
    Expires: 60 * 60,
    ContentType: 'application/octet-stream'
});

这个URL在我的前端看起来不错,我像这样通过XMLHttpRequest

const xhr = new XMLHttpRequest();

xhr.open('PUT', body.url); // body.url being the presigned url
xhr.setRequestHeader('x-amz-acl', 'public-read');
xhr.setRequestHeader('Content-Type', 'application/octet-stream');
xhr.send(blob); // blob being the webm binary

我使用的CORS设置仅允许从任何地方进行PUT

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

我检查了一下,效果很好。 另外,IAM用户也有权将其放入存储桶

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::screen-capture-uploads/*"
            ]
        }
    ]
}

到目前为止,我设法解决了自己的问题。我查看了其他答案,但没有找到对我有用的东西。有人对我有任何想法吗?

1 个答案:

答案 0 :(得分:0)

我去获取了它产生的端点,然后将其直接放在浏览器中。原来我没有在使用的存储桶上启用传输加速!

这只是一个不好的请求,没有任何其他信息