我正在尝试使用AWS S3预签名的URL使用Node.js AWS SDK。
我想在S3对象上添加关于用户数据的自定义元数据。
因此,我在“字段”和“条件”中为“createPresignedPost”添加了“x-amz-meta-userid”。
const result: S3.PresignedPost = await new Promise((resolve, reject) => {
s3.createPresignedPost({
Bucket: "my-bucket",
Fields: {
key: "my-image",
"x-amz-meta-userid": "1",
},
Expires: 60 * 5, // 5 minutes (unit: seconds)
Conditions: [
["content-length-range", 0, 50 * 1024 * 1024 * 10], // 0 ~ 10mb
["eq", "$x-amz-meta-userid", "1"],
],
}, (err, data) => {
if (err) {
return reject(err);
}
data.fields["x-amz-meta-userid"] = "1";
return resolve(data);
});
});
但是当我使用我创建的预签名URL时,它的响应是这样的。
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>AccessDenied</Code>
<Message>Invalid according to Policy: Policy Condition failed: ["eq", "$x-amz-meta-userid", "1"]</Message>
<RequestId>753WHC9TX37JY7C1</RequestId>
<HostId>DYC2smyh+g4JDGbdlFx1Ub/1YPmexgvCrresMw0KeEE1V3tEMZnbC5F6JtAGUWP+Oegu7kaplHA=</HostId>
</Error>
这是由Postman创建的请求代码。(我使用Postman)
var axios = require('axios');
var FormData = require('form-data');
var fs = require('fs');
var data = new FormData();
data.append('key', 'my-image');
data.append('bucket', 'my-bucket');
data.append('X-Amz-Algorithm', 'AWS4-HMAC-SHA256');
data.append('X-Amz-Credential', 'xxxx');
data.append('X-Amz-Date', '20220529T130050Z');
data.append('Policy', 'xxxx');
data.append('X-Amz-Signature', 'xxxx');
data.append('file', fs.createReadStream('my-photo.jpf'));
data.append('x-amz-meta-userid', '1');
var config = {
method: 'post',
url: 'https://s3.amazonaws.com/my-bucket',
headers: {
...data.getHeaders()
},
data : data
};
axios(config)
.then(function (response) {
console.log(JSON.stringify(response.data));
})
.catch(function (error) {
console.log(error);
});
我不确定我犯了一个错误,或者我不能为S3预签名的URL添加元数据。
(When我试着在没有“x-amz-meta-userid”的情况下使用“createPresignedPost”,效果很好)
1条答案
按热度按时间ltskdhd11#
我遇到了同样的问题,虽然听起来很尴尬,但我通过更改参数的顺序并在最后发送文件参数来解决它,尝试如下: