AWS S3 node.js SDK uploaded file and folder permissions
Found ithttp://docs.aws.amazon.com/AmazonS3/latest/dev/ACLOverview.html#CannedACL
need to add option in putObject
or upload
:
ACL:'public-read'
The following works like a charm. (Note the ACL key in params)
const params = { Bucket: bucketName + path, Key: key, Body: buffer, ContentEncoding: 'base64', ContentType: 'image/jpeg', ACL:'public-read'};await s3.putObject(params).promise();
Note: IAM permission "s3:PutObjectACL" must be included in the appropriate policy otherwise you will get Access Denied errors.
Here is a working code snippet that uploads a local file (test-file.gif) to S3 bucket and prints out a URL for everyone to download.
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 objects3 = new AWS.S3({ apiVersion: '2006-03-01' });// Get file streamconst fileStream = fs.createReadStream(FILE_NAME_LOCAL);// Call S3 to retrieve upload file to specified bucketconst 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); }});