如何使用带有Lambda函数的Node.js在AWS S3存储桶中创建嵌套文件夹?

时间:2019-04-29 18:14:41

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

在我的项目中,我使用的是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值存储在子文件夹中?

3 个答案:

答案 0 :(得分:1)

在S3中,没有“子文件夹”,它是固定存储。它只是存储桶中的文件。但是,如果在文件密钥中包含正斜杠,AWS S3控制台(和其他工具)将使用该斜杠来显示文件,就像它们在“文件夹”中一样。

folder1/folder2/bird.jpg有两个“前缀”,但是是单个文件的单个密钥。

因此,只需随便命名,即可创建“文件夹结构”。然后S3将其存储在存储桶中!

答案 1 :(得分:0)

如果您直接上传到不存在的路径,S3将为您创建文件夹。

因此,例如,如果您上传,则具有以下结构

folder --- > subfolder  -->  image

如果您在上传时指定的路径是

/folder/subfolder/image.jpg

S3将自动创建文件夹和子文件夹。

答案 2 :(得分:0)

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
});

进一步向下滚动以获取说明:

  

Body —(缓冲区,类型数组,Blob,字符串,ReadableStream)   对象数据。

     

桶-(字符串)   发起PUT操作的存储桶的名称。

     

键-(字符串)   发起PUT操作的对象密钥。

params转换为您的示例:

var folder = // ...
var subFolder = // ...
var fileName = // ...
var fileContent = // ...

var params = {
  Bucket: bucketName,
  Key: `${folder}/${subFolder}/${fileName}`,
  Body: fileContent
};

评论

  • 作为一般规则,切勿将凭据(在这种情况下为accessKeyIdsecretAccessKey)存储为源代码的一部分。在AWS Lambda中,您通过创建一个Lambda Execution Role来关联必要的权限,该{{3}}被定制为仅创建Lambda源代码(在您的示例中,s3:PutObject用于S3访问和托管策略)所需的特定操作。 arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole用于CloudWatch日志。

  • 您每个事件都调用一次s3.createBucket(),这意味着您(与您的解释相反)将尝试为每个Lambda调用创建一个新存储桶。

  • 您正在调用callback(...)回调之前调用s3.putObject()。因此,您的函数将在完成之前返回。将回调移动到s3.putObject()回调中,并确保在失败的情况下使用错误参数调用该回调,以确保函数正确返回。