【问题标题】:AWS S3 node.js SDK uploaded file and folder permissionsAWS S3 node.js SDK 上传文件和文件夹权限
【发布时间】:2012-12-31 19:17:52
【问题描述】:

我正在使用 aws-sdk 包将文件上传到 S3:

fs.readFile(sourceFile, function (err, data) {
    if (err) { throw err; }

    s3.client.putObject({
        Bucket: bucketName,
        Key: 'Folder/image.jpg',
        Body: data
    }, function (res) {
            console.log('Successfully uploaded file.');
        })

});

我需要使上传的文件可以通过云端下载,如果我猜对了,我需要对文件设置权限:每个人都打开/下载,Folder2 应该公开(通过菜单 Make Public)。所以2个问题:

1) 如何设置\修改上传文件\文件夹的权限?

2) 如何使用适用于 node.js 的 AWS 开发工具包公开文件夹。

【问题讨论】:

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


    【解决方案1】:

    这是一个工作代码 sn-p,它将本地文件 (test-file.gif) 上传到 S3 存储桶并打印出一个 URL 供所有人下载。

    const fs = require('fs');
    const AWS = require('aws-sdk');
    AWS.config.update({ region: 'us-west-1' });
    
    // Fill in your bucket name and local file name:
    const BUCKET_NAME = 'test-bucket-name-goes-here'
    const FILE_NAME_LOCAL = './test-file.gif'
    const FILE_NAME_S3 = 'this-will-be-the-file-name-on-s3.gif'
    const FILE_PERMISSION = 'public-read'
    
    // Create S3 service object
    s3 = new AWS.S3({ apiVersion: '2006-03-01' });
    
    // Get file stream
    const fileStream = fs.createReadStream(FILE_NAME_LOCAL);
    
    // Upload the file to a specified bucket
    const uploadParams = {
        Bucket: BUCKET_NAME,
        Key: FILE_NAME_S3,
        Body: fileStream,
        ACL: FILE_PERMISSION
    };
    
    s3.upload(uploadParams, function (err, data) {
        if (err) {
            console.log("Error", err);
        } if (data) {
            console.log("Upload Success", data.Location);
        }
    });
    

    【讨论】:

      【解决方案2】:

      找到了 http://docs.aws.amazon.com/AmazonS3/latest/dev/ACLOverview.html#CannedACL

      需要在putObjectupload中添加选项:

      ACL:'public-read'
      

      【讨论】:

      • 这是您在传递给putObject 的第一个对象时添加的选项吗?意思是,它是与BucketKeyBody 并列的属性吗?
      • 我也有上述问题,所以只是为可能有问题的人回答它,ACL:'public-read' 应该与BucketKeyBody 对象一起添加发送到 S3。感谢@WHITECOLOR 的帮助!
      • 我假设您在某个时候找到了答案,但如果您没有找到答案,是的,您可以将 ACL 属性与“Bucket”和“Key”一起传递。
      • 请注意,IAM 权限“s3:PutObjectACL”必须包含在相应的策略中。
      • 知道为什么当用户拥有 AmazonS3FullAccess 权限时访问会被拒绝?
      【解决方案3】:

      下面的工作就像一个魅力。 (注意参数中的 ACL 键

      const params = {
        Bucket: bucketName + path,
        Key: key,
        Body: buffer,
        ContentEncoding: 'base64',
        ContentType: 'image/jpeg',
        ACL:'public-read'
      };
      await s3.putObject(params).promise();

      注意:IAM 权限“s3:PutObjectACL”必须包含在相应的策略中,否则您将收到Access Denied错误。 p>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-15
        • 2022-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多