如何使用带有 lambda 函数的 nodejs 在 aws s3 存储桶中创建嵌套文件夹?

Ram*_*ddy 1 amazon-s3 amazon-web-services node.js 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)
Run Code Online (Sandbox Code Playgroud)

我使用以下代码创建了存储桶和文件夹,我需要在文件夹中创建子文件夹并存储 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'});
};
Run Code Online (Sandbox Code Playgroud)

如何在文件夹中创建子文件夹并在子文件夹中存储文本或 jpg 值??

cla*_*lay 5

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

folder1/folder2/bird.jpg 有两个“前缀”,但对于单个文件是一个 Key。

因此,您可以随意命名它,您可以创建“文件夹结构”。S3 将其存储在存储桶中!


mat*_*sev 5

S3 中没有文件夹。存储桶中的每个对象都通过其键进行引用。但是,AWS 控制台(和其他客户端)选择显示密钥,就好像/密钥中的每个密钥都充当文件夹分隔符一样。

\n\n

从S3.putObject() API 文档复制(向下滚动):

\n\n
var params = {\n  Bucket: \'STRING_VALUE\', /* required */\n  Key: \'STRING_VALUE\', /* required */\n  Body: new Buffer(\'...\') || \'STRING_VALUE\' || streamObject,\n  // other parameters omitted\n};\ns3.putObject(params, function(err, data) {\n  if (err) console.log(err, err.stack); // an error occurred\n  else     console.log(data);           // successful response\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

进一步向下滚动查看说明:

\n\n
\n

正文 \xe2\x80\x94(缓冲区、类型化数组、Blob、字符串、ReadableStream)\n 对象数据。

\n\n

Bucket \xe2\x80\x94 (String)\n 发起 PUT 操作的存储桶的名称。

\n\n

Key \xe2\x80\x94 (String)\n 为其启动 PUT 操作的对象键。

\n
\n\n

翻译params成你的例子:

\n\n
var folder = // ...\nvar subFolder = // ...\nvar fileName = // ...\nvar fileContent = // ...\n\nvar params = {\n  Bucket: bucketName,\n  Key: `${folder}/${subFolder}/${fileName}`,\n  Body: fileContent\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

评论

\n\n
    \n
  • 作为一般规则,您永远不应该将凭据(在本例中为accessKeyIdsecretAccessKey)存储为源代码的一部分。在 AWS Lambda 中,您可以通过创建Lambda 执行角色来关联必要的权限,该角色经过定制,仅创建 Lambda 源代码所需的特定操作(在您的示例中,用于 S3 访问和CloudWatch 日志的s3:PutObject托管策略) 。arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

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

  • \n
  • 您正在触发回调callback(...)之前s3.putObject()调用。因此,您的函数将在完成之前返回。将回调调用移至s3.putObject()回调内部,并确保在无法确保函数正确返回的情况下使用错误参数调用回调。

  • \n
\n


Gho*_*ima 1

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

例如,如果您上传,您将具有以下结构

folder --- > subfolder  -->  image
Run Code Online (Sandbox Code Playgroud)

如果上传时指定路径为

/folder/subfolder/image.jpg
Run Code Online (Sandbox Code Playgroud)

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