如何使用createPresignedPost公开访问AWS S3文件?

时间:2019-12-26 05:22:53

标签: node.js amazon-web-services amazon-s3

我有一个用例将AWS S3存储桶设为默认私有,但是,
在上传到AWS S3时将某些对象设为公开。

我正在使用以下代码使用public-read-

和ACL设置对AWS S3 URL进行签名。
module.exports.generateS3PostSignedUrl = async (bucketName, bucketKey, objectExpiry) => {

    let s3Client = new AWS.S3({
        region: 'some-region'
    });

    let signingParams = {
        Expires: objectExpiry,
        Bucket: bucketName,
        Fields: {
            key: bucketKey,
        },
        Conditions: [
            ['acl', 'public-read']   
        ],
        ACL: 'public-read'
    }

    let s3createPresignedPost = util.promisify(s3Client.createPresignedPost).bind(s3Client);
    let signedUrl = await s3createPresignedPost(signingParams);

    return signedUrl;
};

上传时请求-

enter image description here

如果我删除了签名参数中的conditions数组,则能够将文件上传到AWS S3,
但是当我单击它的URL时文件仍然不公开。
我相信我在signingParams部分做错了代码。


参考-
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#createPresignedPost-property

Upload file to s3 with POST

1 个答案:

答案 0 :(得分:1)

这里的参数顺序很重要。将acl参数放在文件之前,它应该可以工作;否则S3只会忽略您提供的值。

下面是在屏幕表格数据中具有不同参数放置位置的示例屏幕截图。

此外,请确保由具有s3:PutObjectAcls3:PutObject权限的用户执行createPresignedPost。

The correct order of form-data parameters

The same request but with acl parameter being placed after file (Ignored by S3)