繁体   English   中英

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

[英]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
};

评论

  • 通常,永远不要将凭据(在这种情况下为accessKeyIdsecretAccessKey )存储为源代码的一部分。 在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM