AWS S3 createPresignedPost URL可以上传任何大小的文件,尽管有限制 &g



我正在创建一个预先签名的URL,以便前端的用户可以上传文件(最大10MB),这就是我如何创建它

const s3Params = {
Bucket: S3_BUCKET,
Expires: 30,
Fields: {
key: key,
},
Conditions: [
["eq", "$acl", "public-read"],
["eq", "$x-amz-meta-filename", fileName],
["content-length-range", 1, 10000000], //10MB
["eq", "$x-amz-meta-userid", userid],
],
};
console.log(s3Params);
s3.createPresignedPost(s3Params, (err, data) => {
if (err) {
console.log(err);
return cb({success: false, error: err});
}
data.fields["x-amz-meta-filename"] = fileName;
data.fields["x-amz-meta-userid"] = userid;
const returnData = {
signedRequest: data,
url: `https://${S3_BUCKET}.s3.amazonaws.com/${key}`,
};
return cb({success: true, data: {returnData}});
});

条件中的将最大文件大小(content-length-range)设置为10MB,但我仍然能够使用生成的预签名URL上传25 MB的文件。我想这可能与桶策略有关,但我不确定。

这是我的桶策略

"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::blah.blah/*"
}
]
}

我认为你的条件被忽略了因为bucket允许匿名写(非常糟糕的做法!)从文档:

如果不提供经过身份验证的请求所需的元素,例如策略元素,则该请求被认为是匿名的并且只有当您配置了公共读写的桶时才会成功。.

当你使用预签名url时,不应该使您的bucket public.

最新更新