[英]How to create nested folders in aws s3 bucket using nodejs with lambda function?
在我的项目中,我使用的是Angular 6,带有lambda函数和api网关的nodejs,下面是我的文件夹结构。
--Bucket Name
|--Folder (folder name dynamically change based on user login)
|----sub Folder (sub folder name dynamically change)
|--- bird.jpg (file name also dynamic)
我已经使用下面的代码创建了存储桶和文件夹,我需要在文件夹中创建子文件夹并存储jpg或文本文件。 下面是我的代码:
var AWS = require('aws-sdk');
AWS.config.update({
region: 'us-east-2',
accessKeyId: 'accessid',
secretAccessKey: 'secret id'
});
var s3 = new AWS.S3();
var bucketName = 'bucket name';
exports.handler = function uploadToS3(event, context, callback) {
s3.createBucket({Bucket: bucketName}, function() {
var params = {Bucket: bucketName,Key: event['keyName']};
s3.putObject(params, function(err, data) {
if (err)
console.log(err);
else
console.log("Successfully uploaded data to " + bucketName);
});
});
callback(null,{ result : 'SUCCESS'});
};
如何在文件夹中创建子文件夹并将文本或jpg值存储在子文件夹中?
在S3中,没有“子文件夹”,它是固定存储。 它只是存储桶中的文件。 但是,如果在文件密钥中包含正斜杠,则AWS S3控制台(和其他工具)将使用该斜杠来显示文件,就像它们在“文件夹”中一样。
folder1/folder2/bird.jpg
具有两个“前缀”,但是是单个文件的单个密钥。
因此,只需随便命名,即可创建“文件夹结构”。 然后S3将其存储在存储桶中!
如果直接上传到不存在的路径,S3将为您创建文件夹。
因此,例如,如果您上传,则具有以下结构
folder --- > subfolder --> image
如果您在上传时指定路径为
/folder/subfolder/image.jpg
S3将自动创建文件夹和子文件夹。
S3中没有文件夹。 存储桶中的每个对象都使用其键进行引用。 但是,AWS控制台(和其他客户端)选择显示密钥,就好像密钥中的每个/
充当文件夹分隔符一样。
从S3.putObject() API文档复制(向下滚动):
var params = {
Bucket: 'STRING_VALUE', /* required */
Key: 'STRING_VALUE', /* required */
Body: new Buffer('...') || 'STRING_VALUE' || streamObject,
// other parameters omitted
};
s3.putObject(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
向下滚动以获取解释:
正文—(缓冲区,类型数组,Blob,字符串,ReadableStream)对象数据。
存储桶—(字符串)启动PUT操作的存储桶的名称。
Key —(字符串)为其发起PUT操作的对象密钥。
将params
翻译为您的示例:
var folder = // ...
var subFolder = // ...
var fileName = // ...
var fileContent = // ...
var params = {
Bucket: bucketName,
Key: `${folder}/${subFolder}/${fileName}`,
Body: fileContent
};
评论
通常,永远不要将凭据(在这种情况下为accessKeyId
和secretAccessKey
)存储为源代码的一部分。 在AWS Lambda中,您可以通过创建一个Lambda执行角色来关联必要的权限,该角色经过定制以仅创建Lambda源代码所需的特定操作(在您的示例中为S3访问的s3:PutObject
和托管策略arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
用于CloudWatch日志的arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
。
您每个事件调用一次s3.createBucket()
,这意味着(与您的解释相反)您将尝试为每次Lambda调用创建一个新存储桶。
您正在触发s3.putObject()
回调之前调用callback(...)
。 因此,您的函数将在完成之前返回。 将您的回调调用s3.putObject()
回调内部,并确保在失败的情况下使用错误参数调用该回调,以确保函数正确返回。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.