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

问题描述 投票:-1回答:3

在我的项目中,我使用的是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值?

node.js amazon-web-services amazon-s3 aws-lambda
3个回答
1
投票

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

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

所以只需将它命名为您想要的,您的“文件夹结构”就是您自己创建的。 S3将它存储在桶中!


0
投票

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

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

folder --- > subfolder  -->  image

如果您在上传时指定路径

/folder/subfolder/image.jpg

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


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 - (Buffer,Typed Array,Blob,String,ReadableStream)对象数据。

Bucket - (字符串)启动PUT操作的存储桶的名称。

Key - (String)启动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来关联必要的权限,该s3:PutObject已定制为仅创建Lambda源代码所需的特定操作(在您的示例中,用于S3访问的arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole和用于CloudWatch日志的托管策略s3.createBucket())。
  • 您在每个事件中调用callback(...)一次,这意味着您(与您的解释相反)将尝试为每个Lambda调用创建一个新存储桶。
  • s3.putObject()回调被触发之前,你正在调用s3.putObject()。因此,您的函数将在完成之前返回。在qazxswpoi回调中移动您的回调调用,并确保在未能确保函数正确返回的情况下使用error参数调用回调。
© www.soinside.com 2019 - 2024. All rights reserved.