AWS S3 Node.js SDK上传文件和文件夹权限

88

我正在使用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.');
        })

});

我需要通过CloudFront将上传的文件变为可下载,如果我理解正确,我需要在文件上设置权限:所有人均可打开/下载,Folder2 应该被设为公共(通过菜单“Make Public”)。 所以有两个问题:

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

2)如何使用AWS SDK for Node.js使文件夹变为公共。

3个回答

152

这是您在传递给 putObject 的第一个对象中设置的选项吗?也就是说,它是与 BucketKeyBody 并列的属性吗? - juanpaco
6
我也有上述问题,为了回答可能也有这个问题的人,需要在发送到S3的“Bucket”,“Key”和“Body”对象中添加ACL:'public-read'。感谢@WHITECOLOR的帮助! - julianwyz
1
我假设你在某个时候已经找到了答案,但是如果你还没有找到,是的,你需要将ACL属性与“Bucket”和“Key”一起传递。 - warriorpostman
12
请注意,IAM 权限 "s3:PutObjectACL" 必须包括在适当的策略中。 - Mark Phillips
2
用户拥有AmazonS3FullAccess权限,为什么会出现访问被拒绝的情况? - user1709076

44
以下代码非常有效。(请注意参数中的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",否则您将会收到访问被拒绝的错误。


26

这是一个可用的代码片段,它将本地文件(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);
    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接